我正在尝试在Python 2.7.10中解决代码中的一些浮点问题。测试时,我遇到了format
方法的奇怪行为:
print "{}".format(0.3000000000004) # 13 decimals
打印:0.3
可是:
print "{}".format(0.300000000004) # 12 decimals
打印:0.300000000004
由于我没有指定格式,为什么它围绕第一个数字呢?是否有默认的允许小数位数?
答案 0 :(得分:11)
由于未指定格式,因此使用默认类型coercion to string。所以这对format
来说并不是一个问题。 Python 2截断为float.__str__
的精度为12个字符(不包括前导零,如果有的话),在这种情况下截断后,所有尾随零都被清除:
>>> str(0.3000000000004) # unlike str(0.3000000000014) -> '0.300000000001'
'0.3'
添加format_spec
:f
会提供默认精度6:
>>> '{:f}'.format(0.3000000000004)
'0.300000'
指定宽度和精度,或使用repr
获得良好的表示:
>>> '{!r}'.format(0.3000000000004)
'0.3000000000004'
但是Python 3中的行为有所不同:
>>> str(0.3000000000004)
'0.3000000000004'
浮点数的格式化只由Python 3中的一个函数float_repr
处理(它没有特殊的float_str
函数):
(reprfunc)float_repr, /* tp_repr */
...
(reprfunc)float_repr, /* tp_str */
而Python2.7分别为__str__
和__repr__
定义了一个单独的处理程序float_str
和float_repr
:
(reprfunc)float_repr, /* tp_repr */
...
(reprfunc)float_str, /* tp_str */
我认为这里的决定变量是超过12d.p的精度损失的原因。是PyFloat_STR_PRECISION
(在Python 2中定义):
#define PyFloat_STR_PRECISION 12
对于默认转换中超过12个字符的浮点数,它会反转为截断。
答案 1 :(得分:-2)
这就是python(和许多其他语言)处理浮点不准确的方式。所以内部这个数字实际上等于0.3。有一个专门针对此问题的网站有多种语言版本:http://0.30000000000000004.com/
对于这个特定的打印,你可以简单地引用数字(使它成为一个字符串),编译器不会尝试对数字进行舍入:
print "{}".format("0.3000000000004")
但是你也不需要使用这种格式:
print "0.3000000000004"