我正在尝试将浮点数添加到整数值,但结果数字被截断为2个小数点。 这是一个例子:
打印1234567890 + .123
输出:1234567890.12
相同的代码在Python shell中正常工作
12345678901 + .123
12345678901.123
如果Integer值的长度小于10,那么我得到预期的数字。
打印123456789.123
输出:123456789.123
答案 0 :(得分:1)
两种情况下的计算都相同,但使用的表示方式不同。请考虑以下Python2(2.7.10)的示例:
>>> a = 1234567890 + .123
>>> a
1234567890.123
>>> print a
1234567890.12
>>> str(a)
'1234567890.12'
>>> repr(a)
'1234567890.123'
当Python shell打印在其中计算的表达式的结果时,它会为结果发出repr()
的结果。通常使用print
,而是为任何不是字符串的输入值调用str()
。 Python文档说:
与repr(object)的区别在于str(object)并不总是尝试返回eval()可接受的字符串;它的目标是返回一个可打印的字符串。
因此,问题导致:为什么str()打印的数字较少,以及它对您的任务是否重要。
正如@MarkDickinson已经提示的那样,Python2中的str()打印最多12个十进制数字(尾随0和#39; s)。但是,Python3(3.4.3)的行为有所不同 - 对于相同的值:
>>> a = 1234567890 + .123
>>> a
1234567890.123
>>> print(a)
1234567890.123
不同之处在于Python3的默认浮点格式是它搜索最短的十进制表示,当转换回float时,它会给出完全相同的值。因为a == float("1234567890.123")
,不会打印更多数字。在以下经典示例中可以更加鲜明地显示出这种差异:
Python2:
>>> v = 0.1 + 0.2
>>> v
0.30000000000000004
>>> print v
0.3
>>> print 0.30000000000000004
0.3
>>> print 0.3000000000004
0.3
>>> print 0.300000000004
0.300000000004
Python3:
>>> v = 0.1 + 0.2
>>> v
0.30000000000000004
>>> print(v)
0.30000000000000004
所以,Python2在有问题的数字之前停止打印,但是Python3没有。
显式格式化请求会更改这两个Python主要版本的逻辑:'%g'和'%f'小数点后默认为6位,如果没有被覆盖,如果没有切换为指数格式。 (同样,没有打印尾随零。)这个条件实际上是从C标准复制的,格式化打印由Python库模仿。