The landed costs button_validate() method attempts to create a correction in quant cost that occurs due to currency rounding. However this can lead to a negative cost value being assigned to a stock.quant

The issue affects move lines with a very low price to quantity ratio. ie 1000 x $0.10
Applying a landed cost of $456.70 to this line gives a diff of $0.4567
Having a 2 decimal rounding on the currency makes diff_rounded = $0.46

Now the formula used to determine the cost correction (diff_correct) on the single qty quant (quant_correct)
```python
diff_correct += (line.quantity * diff) - (line.quantity * diff_rounded)
```
This equates to diff_correct = 0.46 + (1000 * 0.4567) - (1000 * 0.46) = -2.84

and then
```python
if quant_correct:
    quant_dict[quant_correct] = quant_correct.cost + diff_correct
for quant, value in quant_dict.items():
    quant.sudo().write({'cost': value})
```
The correction quant's cost becomes $-2.74

If this quant is then in an inventory adjustment, the accounting lines generated violate a constraint on the journal that (credit + debit) >= (0)

I would suggest that the solution is that this line should be changed to only ever round down
```python
diff_rounded = tools.float_round(diff, precision_rounding=curr_rounding)
```
If rounded down in this case, diff_rounded = 0.45  and diff_correct would be calculated as $7.15 and quant.cost = $7.25
A disproportionately large cost for a $0.10 product, but at least it's positive.

Perhaps a rounding_method='DOWN' should be implemented in tools.float_utils ?
addons/stock_account/models/stock.py
_inherit = "stock.location"
    valuation_in_account_id = fields.Many2one(
        'account.account', 'Stock Valuation Account (Incoming)',
        domain=[('internal_type', '=', 'other'), ('deprecated', '=', False)],
        help="Used for real-time inventory valuation. When set on a virtual location (non internal type), "
             "this account will be used to hold the value of products being moved from an internal location "
             "into this location, instead of the generic Stock Output Account set on the product. "
             "This has no effect for internal locations.")
    valuation_out_account_id = fields.Many2one(
        'account.account', 'Stock Valuation Account (Outgoing)',
        domain=[('internal_type', '=', 'other'), ('deprecated', '=', False)],
        help="Used for real-time inventory valuation. When set on a virtual location (non internal type), "
             "this account will be used to hold the value of products being moved out of this location "
             "and into an internal location, instead of the generic Stock Output Account set on the product. "
             "This has no effect for internal locations.")
class StockQuant(models.Model):
    _inherit = "stock.quant"
    @api.multi
    def _compute_inventory_value(self):
        real_value_quants = self.filtered(lambda quant: quant.product_id.cost_method == 'real')
        for quant in real_value_quants:
            quant.inventory_value = quant.cost * quant.qty
        return super(StockQuant, self - real_value_quants)._compute_inventory_value()
    @api.multi
    def _price_update(self, newprice):