格式化浮点数时,Python格式默认舍入

时间:2017-04-03 11:48:29

标签: python floating-point numbers format

我正在尝试在Python 2.7.10中解决代码中的一些浮点问题。测试时,我遇到了format方法的奇怪行为:

print "{}".format(0.3000000000004) # 13 decimals

打印:0.3

可是:

print "{}".format(0.300000000004) # 12 decimals

打印:0.300000000004

由于我没有指定格式,为什么它围绕第一个数字呢?是否有默认的允许小数位数?

2 个答案:

答案 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_strfloat_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"