将float转换为int会导致值不正确

时间:2012-05-13 18:40:20

标签: python

结果变量将保持值9.0。那么为什么当我使用“%d”打印时会打印返回8?

result = (((1.7526 % 0.3048) / 0.3048) * 12)
print(result)        #prints 9.0
print("%f" % result) #prints 9.0
print("%d" % result) #prints 8

2 个答案:

答案 0 :(得分:5)

浮点运算本质上是不精确的。在Python中,通常执行计算以获得双精度。您的数字不能精确表示双精度,因此会出现舍入误差。在我的计算机上,result8.9999999999999929

>>> result = (((1.7526 % 0.3048) / 0.3048) * 12)
>>> result
8.9999999999999929
>>> print result
9.0
>>> int(result)
8

当您打印该值时,它会四舍五入为9.0,但result中存储的实际值小于9.0。因此,当您将result转换为整数时,它会被截断为8

关键问题在于价值的可表示性。 1.75260.3048都不能以双精度表示,因为在Python解释器中很容易看到。

>>> 1.7526
1.7525999999999999
>>> 0.3048
0.30480000000000002

故事的寓意是,在使用浮点值时,不应该指望精确算术。对该主题的开创性讨论是:What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:1)

%d会截断您的值,这就是您获得8的原因。

二进制系统中的浮点表示是近似值,表示9.0处显示的值在内部小于9,因此被截断为8。

例如,所有这些产生3。

In [19]: i = 3.1
In [20]: print '%d' %i
3

In [21]: i = 3.4
In [22]: print '%d' %i
3

In [23]: i = 3.7
In [24]: print '%d' %i
3

In [25]: i = 3.9999
In [26]: print '%d' %i
3

This Wikipeadia文章提供了有关浮点表示的一些其他背景知识。