结果变量将保存值 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
结果变量将保存值 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
浮点运算本质上是不精确的。在 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
这个故事的寓意是,在使用浮点值时,您不应该期望精确的算术。该主题的开创性讨论是:每个计算机科学家都应该知道的关于浮点运算的知识。
截断您的%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
这篇维基百科文章提供了一些关于浮点表示的额外背景。