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
move.product_id.with_context(force_company=move.company_id.id).sudo().write({'standard_price': new_std_price})
            std_price_update[move.company_id.id, move.product_id.id] = new_std_price
    @api.multi
    def product_price_update_after_done(self):
        ''' Adapt standard price on outgoing moves, so that a
        return or an inventory loss is made using the last value used for an outgoing valuation. '''
        to_update_moves = self.filtered(lambda move: move.location_dest_id.usage != 'internal')
        to_update_moves._store_average_cost_price()
    def _store_average_cost_price(self):
        """ Store the average price of the move on the move and product form (costing method 'real')"""
        for move in self.filtered(lambda move: move.product_id.cost_method == 'real'):
            
            if any(q.qty <= 0 for q in move.quant_ids) or move.product_qty == 0:
                
                return
            
            
            # kn
            # averag
            valuation_price = sum(q.qty * q.cost for q in move.quant_ids)
            average_valuation_price = valuation_price / move.product_qty
            move.product_id.with_context(force_company=move.company_id.id).sudo().write({'standard_price': average_valuation_price})
            move.write({'price_unit': average_valuation_price})
        for move in self.filtered(lambda move: move.product_id.cost_method != 'real' and not move.origin_returned_move_id):
            # Unit pri
            # price fl
            # confirma
            move.write({'price_unit': move.product_id.standard_price})
    @api.multi
    def _get_accounting_data_for_valuation(self):