4

这是一个例子:

>>> "%.2f" % 0.355
'0.35'
>>> "%.2f" % (float('0.00355') *100)
'0.36'

为什么他们给出不同的结果?

4

3 回答 3

6

这不是格式错误。这只是浮点运算。查看作为格式命令的基础的值:

In [18]: float('0.00355')
Out[18]: 0.0035500000000000002

In [19]: float('0.00355')*100
Out[19]: 0.35500000000000004

In [20]: 0.355
Out[20]: 0.35499999999999998

这两个表达式创建不同的值。

我不知道它是否在 2.4 中可用,但您可以使用 decimal 模块来完成这项工作:

>>> import decimal
>>> "%.2f" % (decimal.Decimal('0.00355')*100)
'0.35'

十进制模块将浮点数视为字符串以保持任意精度。

于 2011-01-28T06:39:08.173 回答
4

因为,与所有浮点“不准确”问题一样,并非每个实数都可以用有限的位数表示。

即使我们要发疯并拥有 65536 位浮点格式,0 和 1 之间的数字数量仍然是,......嗯,无限 :-)

几乎可以肯定的是,第一个略低于0.355(例如,0.3549999999999),而第二个略高于例如,0.3550000001)。

有关该主题的进一步阅读,请参见此处

Harald Schmidt 的优秀在线转换器是一个很好的工具来了解浮点数是如何工作的。这太方便了,我实际上也实现了自己的 C#,能够处理 IEEE754 单精度双精度。

于 2011-01-28T06:37:50.913 回答
1

浮点数的算术通常是不准确的。

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

于 2011-01-28T06:38:50.500 回答