2

结果变量将保存值 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
4

2 回答 2

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.

关键问题是价值的可表示性。正如在 Python 解释器中很容易看到的那样,两者都1.7526不能以双精度精确表示。0.3048

>>> 1.7526
1.7525999999999999
>>> 0.3048
0.30480000000000002

这个故事的寓意是,在使用浮点值时,您不应该期望精确的算术。该主题的开创性讨论是:每个计算机科学家都应该知道的关于浮点运算的知识

于 2012-05-13T18:44:31.150 回答
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

这篇维基百科文章提供了一些关于浮点表示的额外背景。

于 2012-05-13T18:43:59.440 回答