结果变量将保留值9.0。为什么然后当我使用“%d”打印时打印返回8?将float浮点数转换为int结果的值不正确
result = (((1.7526 % 0.3048)/0.3048) * 12)
print(result) #prints 9.0
print("%f" % result) #prints 9.0
print("%d" % result) #prints 8
结果变量将保留值9.0。为什么然后当我使用“%d”打印时打印返回8?将float浮点数转换为int结果的值不正确
result = (((1.7526 % 0.3048)/0.3048) * 12)
print(result) #prints 9.0
print("%f" % result) #prints 9.0
print("%d" % result) #prints 8
的%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本文提供这样的我有关浮点表示的其他背景。
浮点算术本质上是不精确的。在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
。
关键问题是值的可表示性。在Python解释器中很容易看到1.7526
和0.3048
都不能精确表示为双精度。
>>> 1.7526
1.7525999999999999
>>> 0.3048
0.30480000000000002
故事的寓意在于,当使用浮点值时,您不应该期待精确的算术。这个主题的开创性讨论是:What Every Computer Scientist Should Know About Floating-Point Arithmetic。