结果变量将保持值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
答案 0 :(得分:5)
浮点运算本质上是不精确的。在Python中,通常执行计算以获得双精度。您的数字不能精确表示双精度,因此会出现舍入误差。在我的计算机上,result
为8.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.7526
和0.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文章提供了有关浮点表示的一些其他背景知识。