2014-01-20 4 views
0

Я пытаюсь заставить поплавок округлить до 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 

Не уверен, что это лучший способ, но, по крайней мере, кажется, работает.

+1

Если вы имеете дело с деньгами, попробуйте выполнить все ваши расчеты в центах (или пенсе, или в любой валюте, с которой вы имеете дело). Итак, вместо 782.88 используйте 78288 и конвертируйте в самом конце с форматированием строки. В качестве альтернативы используйте Decimal.decimal(). – MattDMo

+0

Кроме того, вместо умножения и деления на 100 вы можете использовать round(), вторым аргументом которого являются цифры для округления. Это смешанное с Decimal должно дать вам легкое решение. – bgusach

+0

@MattDMo: Выполнение арифметики в единицах центов не фиксирует арифметические проблемы. Если арифметика использует с плавающей точкой, она все равно имеет ошибки с плавающей запятой. если арифметика использует целые числа, она по-прежнему имеет целочисленные ошибки. Например, в этом вопросе денежная сумма умножается на 1.12. Даже если денежная сумма была в центах, продукт будет включать в себя несколько кратных 0,12 цента. Это будет потеряно в целочисленной арифметике, которая усекает. Затем, поскольку дробная сумма была потеряна, ее нет округлять. –

ответ

1

Добро пожаловать в мир с плавающей точкой. Прочитайте this, чтобы узнать, что происходит.

Результат 699 * 1.12 не может быть точно представлен компьютером, поэтому результат округления неправильный.

>>> 699 * 1.12 
782.8800000000001 

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

+0

Спасибо. Я использовал часть этой информации для составления решения (опубликовано как редактирование для моего сообщения) – crookedleaf