这是一个例子:
>>> "%.2f" % 0.355
'0.35'
>>> "%.2f" % (float('0.00355') *100)
'0.36'
为什么他们给出不同的结果?
这是一个例子:
>>> "%.2f" % 0.355
'0.35'
>>> "%.2f" % (float('0.00355') *100)
'0.36'
为什么他们给出不同的结果?
这不是格式错误。这只是浮点运算。查看作为格式命令的基础的值:
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'
十进制模块将浮点数视为字符串以保持任意精度。
因为,与所有浮点“不准确”问题一样,并非每个实数都可以用有限的位数表示。
即使我们要发疯并拥有 65536 位浮点格式,0 和 1 之间的数字数量仍然是,......嗯,无限 :-)
几乎可以肯定的是,第一个略低于0.355(例如,0.3549999999999),而第二个略高于(例如,0.3550000001)。
有关该主题的进一步阅读,请参见此处。
Harald Schmidt 的优秀在线转换器是一个很好的工具来了解浮点数是如何工作的。这太方便了,我实际上也实现了自己的 C#,能够处理 IEEE754 单精度和双精度。