Ошибка округления десятичного числа - PullRequest
0 голосов
/ 05 июня 2018

Я наткнулся на проблему с методом квантования при использовании типа данных Десятичная, похоже, он дает ошибки округления:

Decimal('1.0055').quantize(Decimal('0.000')) # Should output 1.006
>> Decimal('1.006') # CORRECT output
Decimal('1.0045').quantize(Decimal('0.000')) # Should output 1.005
>> Decimal('1.004') # INCORRECT output

Почему иногда происходит округление вверх, а иногда округление вниз?

1 Ответ

0 голосов
/ 05 июня 2018

tl; dr Это то, что называется банковским округлением .

Режим округления по умолчанию -

ROUND_HALF_EVEN (to nearest with ties going to nearest even integer)

, что и естьвы видите: связи между 4 и 5 и между 5 и 6 переходят в четные числа (4 и 6 соответственно).

Если выЕсли вам нужен другой режим округления, вам нужно указать его явно.

Возможны следующие варианты:

ROUND_CEILING (towards Infinity),
ROUND_DOWN (towards zero),
ROUND_FLOOR (towards -Infinity),
ROUND_HALF_DOWN (to nearest with ties going towards zero),
ROUND_HALF_EVEN (to nearest with ties going to nearest even integer),
ROUND_HALF_UP (to nearest with ties going away from zero), or
ROUND_UP (away from zero).
ROUND_05UP (away from zero if last digit after rounding towards zero would have been 0 or 5; otherwise towards zero)

Документация: https://docs.python.org/2/library/decimal.html#decimal.Context

См. аргумент rounding дляquantize(): https://docs.python.org/2/library/decimal.html#decimal.Decimal.quantize

...