Я пытаюсь заставить поплавок округлить до 2-го знака после запятой. Я знаю, что это не лучшая практика, но это то, что мне нужно для программы, над которой я работаю. Так, например:python 2.7 force round up 2 decimal places
100.00 = 100.00
100.001 = 100,01
100.009 = 100.01
Я получил довольно близко к результатам мне нужно с Math.ceil и наконечником я прочитал в другой пост, но я столкнулся с проблемой, когда, если номер ввода уже заканчивается ровно в 2 десятичных знаках, он округляется без необходимости. Вот пример:
import math
taxpcnt = 1.12
roomsubtotal = 699.00
roomttl = math.ceil(taxpcnt * roomsubtotal * 100)/100
print roomttl
Это я думаю, что бы вернуть 782.88, так как 699 * 1,12 точно 782,88, но вместо этого он возвращает 782.89. Weirder is if i 'print taxpcnt * roomsubtotal', я получаю 782.88. Если я меняю код на:
roomttl = math.ceil(782.88 * 100)/100
Я получаю правильное значение. Но по какой-то причине все вместе это не правильно.
Любые советы о том, как правильно получить то, что я пытаюсь достичь?
Edit: Я думаю, что я склеиваются решение:
import math
taxpcnt = 1.12
roomsubtotal = 699.00
rate = "%.2f" % (taxpcnt * roomsubtotal * 100)
rate = float(rate)
roomttl = math.ceil(rate)/100
Не уверен, что это лучший способ, но, по крайней мере, кажется, работает.
Если вы имеете дело с деньгами, попробуйте выполнить все ваши расчеты в центах (или пенсе, или в любой валюте, с которой вы имеете дело). Итак, вместо 782.88 используйте 78288 и конвертируйте в самом конце с форматированием строки. В качестве альтернативы используйте Decimal.decimal(). – MattDMo
Кроме того, вместо умножения и деления на 100 вы можете использовать round(), вторым аргументом которого являются цифры для округления. Это смешанное с Decimal должно дать вам легкое решение. – bgusach
@MattDMo: Выполнение арифметики в единицах центов не фиксирует арифметические проблемы. Если арифметика использует с плавающей точкой, она все равно имеет ошибки с плавающей запятой. если арифметика использует целые числа, она по-прежнему имеет целочисленные ошибки. Например, в этом вопросе денежная сумма умножается на 1.12. Даже если денежная сумма была в центах, продукт будет включать в себя несколько кратных 0,12 цента. Это будет потеряно в целочисленной арифметике, которая усекает. Затем, поскольку дробная сумма была потеряна, ее нет округлять. –