浮点在Windows上的python中截断为2位数

时间:2015-11-25 06:37:56

标签: python python-2.7 eclipse-plugin floating-point

我正在尝试将浮点数添加到整数值,但结果数字被截断为2个小数点。 这是一个例子:

打印1234567890 + .123

输出:1234567890.12

相同的代码在Python shell中正常工作

  
    
      

12345678901 + .123

    
  
12345678901.123

如果Integer值的长度小于10,那么我得到预期的数字。

打印123456789.123

输出:123456789.123

1 个答案:

答案 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库模仿。