округление поплавков в python (обработка 5 с) - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь найти лучший способ надежно округлять поплавки в python, используя алгоритм округления до половины. Кажется, лучший способ сделать это - использовать десятичную библиотеку. Однако я ожидаю, что этот метод перенесет округление до 5 через число с плавающей точкой. Например:

from decimal import *
Decimal('3.445').quantize(Decimal('0.1'), rounding=ROUND_HALF_UP)

Результат - 3,4. То, что я ожидал бы сделать алгоритм, это перенести округление до 5, так что 3.445 = 3.45 = 3.5.

Кто-нибудь знает, как это сделать в python? Я не могу найти надежный способ сделать это.

1 Ответ

1 голос
/ 02 апреля 2020

Округление до половины не работает путем переноса округлений из младших разрядов, но просто определяет половину по данному показателю степени. Так как 3,445% 0,1 == 0,045, что меньше половины 0,1, оно будет правильно округлено до 3,4.

Вместо этого вы можете реализовать требуемые логики округления c, округлив половину до указанного десятичного числа от второе по наименьшему значению di git по отношению к данному целевому показателю в al oop:

def round_half_up_carryover(d, target_exp):
    exp = Decimal(10) ** (d.as_tuple()[2] + 1)
    while exp <= target_exp:
        d = d.quantize(exp.normalize(), rounding=ROUND_HALF_UP)
        exp *= 10
    return d

, так что:

print(round_half_up_carryover(Decimal('3.445'), Decimal('0.1')))

будет выводить:

3.5
...