如何打印浮点数的全精度[Python]

时间:2018-09-27 07:01:49

标签: python python-2.7 floating-point

我编写了以下函数,其中传递了x,y的值:

def check(x,y):
  print type(x)
  print type(y)
  print x
  print y
  if x == y:
    print "Yes"

现在我打电话给: 检查(1.00000000000000001,1.0000000000000002) 正在打印:

<type 'float'>
<type 'float'>
1.0
1.0

现在从变量x和y的打印语句中,我很难调试x!= y的原因(尽管两者都打印相同的值)。尽管我通过打印x-y来解决它,这给我带来了不同,但是有什么方法可以修改打印语句,以便在不使用任何外部打印库和减法解决方案的情况下,知道为什么在这种特殊用例中x!= y。

4 个答案:

答案 0 :(得分:3)

要获得完整的精度和正确的格式,请

format(2**(1/2), '.60g') 
# -> '1.4142135623730951454746218587388284504413604736328125'

并使用

进行检查
import decimal
print(decimal.Decimal.from_float(2**(1/2))
# -> '1.4142135623730951454746218587388284504413604736328125'

g格式类型在需要时切换为指数符号。

答案 1 :(得分:1)

这里真正需要的是小数。 Python float不允许您达到这种精度。

In [28]: d= Decimal('1.00000000000000001')

In [29]: print d
1.00000000000000001

答案 2 :(得分:1)

获取浮点数的字符串表示形式的简单解决方案是使用json.dumps

JSON序列化/反序列化必须确保往返无损失,因此,该实现会生成您要查找的字符串表示形式:

import json

def check(x,y):
    print(json.dumps(x))
    print(json.dumps(y))
    print("x == y is {}".format(x == y))
In [1]: check(1.00000000000000001, 1.0000000000000002)
1.0
1.0000000000000002
x == y is False

In [2]: check(1e-300, 2e-300)
1e-300
2e-300
x == y is False

In [3]: check(1e+300, 2e+300)
1e+300
2e+300
x == y is False

这也说明1.00000000000000001实际上是1.0。也可以通过使用np.nextafter枚举1.0左右的数字来进行检查,这会产生下一个更大或更小的可表示浮点值:

    0.9999999999999994
    0.9999999999999996
    0.9999999999999997
    0.9999999999999998
    0.9999999999999999
[*] 1.0               
    1.0000000000000002
    1.0000000000000004
    1.0000000000000007
    1.0000000000000009
    1.000000000000001 

另一注:json.dumps具有在某些情况下可能令人讨厌的功能:它甚至支持NaN和+/-无限值,即使它们不是JSON标准的一部分也是如此。在这种用例中是有益的。


我看到的另一种方法是基于g format specifier使用"{:.17g}".format(x)。格式化程序还会在必要时从e符号转换为固定符号,并且17位数字应该始终足够精确,但我尚未对此进行验证。在某些情况下,它可能会产生太多数字。

答案 3 :(得分:0)

这里讨论了类似情况的解决方案: print float to n decimal places including trailing 0's

我不知道是否可以打印浮子的整个长度。但是我想,如果您在浮点数后使用100个左右的值,它将解决您必须解决的问题。