python 2.7强制将小数点后两位四舍五入

python 2.7强制将小数点后两位四舍五入,python,floating-point,decimal,rounding,Python,Floating Point,Decimal,Rounding,我正试图强制一个浮点数四舍五入到小数点后的第二位。我知道这不是最佳实践,但这正是我所从事的项目所需要的。例如: 100.00=100.00 100.001=100.01 100.009=100.01 通过math.ceil和我在另一篇文章中读到的一个技巧,我已经非常接近我需要的结果,但是我遇到了一个问题,如果输入的数字已经精确地在小数点后2位结束,那么它就不必要地向上取整了。以下是一个例子: import math taxpcnt = 1.12 roomsubtotal = 699.00 r

我正试图强制一个浮点数四舍五入到小数点后的第二位。我知道这不是最佳实践,但这正是我所从事的项目所需要的。例如:

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。更奇怪的是,如果我“打印taxpcnt*roomsubtotal”,我会得到782.88。如果我将代码更改为:

roomttl = math.ceil(782.88 * 100) / 100
我得到了正确的值。但出于某种原因,总的来说,这是不正确的

关于如何正确实现我的目标,有什么建议吗

编辑:我想我已经拼凑出了一个解决方案:

import math

taxpcnt = 1.12
roomsubtotal = 699.00

rate = "%.2f" % (taxpcnt * roomsubtotal * 100)
rate = float(rate)

roomttl = math.ceil(rate) / 100

不确定这是否是最好的方法,但至少它似乎有效。

欢迎来到浮点世界。读一读,了解发生了什么事

计算机无法准确表示
699*1.12
的结果,因此四舍五入的结果不正确

>>> 699 * 1.12
782.8800000000001

如果你只关心两个小数点,考虑使用不同的类型,比如A.< /P>如果你在处理钱,试着用美分(或便士,或者你正在处理的任何货币)做你所有的计算。因此,使用78288代替782.88,并在最后使用字符串格式进行转换。或者,使用Decimal.Decimal()。此外,您可以使用round(),而不是乘和除100,其中第二个参数是要舍入的数字。这和十进制混合在一起会给你带来一个简单的解决方案。@MattDMo:以美分为单位执行算术并不能解决算术问题。如果算术使用浮点,它仍然有浮点错误。如果算术使用整数,它仍然有整数错误。例如,在这个问题中,货币金额乘以1.12。即使货币金额以美分为单位,产品也会包含0.12美分的倍数。这将在整数运算中丢失,而整数运算会截断。那么,由于部分金额已丢失,因此不需要进行四舍五入。谢谢。我已经使用了这些信息中的一些信息来整理一个解决方案(作为我文章的编辑发布)