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
""" Return the accounts and journal to use to post Journal Entries for
        the real-time valuation of the quant. """
        self.ensure_one()
        accounts_data = self.product_id.product_tmpl_id.get_product_accounts()
        if self.location_id.valuation_out_account_id:
            acc_src = self.location_id.valuation_out_account_id.id
        else:
            acc_src = accounts_data['stock_input'].id
        if self.location_dest_id.valuation_in_account_id:
            acc_dest = self.location_dest_id.valuation_in_account_id.id
        else:
            acc_dest = accounts_data['stock_output'].id
        acc_valuation = accounts_data.get('stock_valuation', False)
        if acc_valuation:
            acc_valuation = acc_valuation.id
        if not accounts_data.get('stock_journal', False):
            raise UserError(_('You don\'t have any stock journal defined on your product category, check if you have installed a chart of accounts'))
        if not acc_src:
            raise UserError(_('Cannot find a stock input account for the product %s. You must define one on the product category, or on the location, before processing this operation.') % (self.product_id.name))
        if not acc_dest:
            raise UserError(_('Cannot find a stock output account for the product %s. You must define one on the product category, or on the location, before processing this operation.') % (self.product_id.name))
        if not acc_valuation:
            raise UserError(_('You don\'t have any stock valuation account defined on your product category. You must define one before processing this operation.'))
        journal_id = accounts_data['stock_journal'].id
        return journal_id, acc_src, acc_dest, acc_valuation
    def _prepare_account_move_line(self, qty, cost, credit_account_id, debit_account_id):