我编写了以下函数,其中传递了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。
答案 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个左右的值,它将解决您必须解决的问题。