3 回答
TA贡献1860条经验 获得超8个赞
要获得完全精确和正确的格式,请执行以下操作
format(2**(1/2), '.60g')
# -> '1.4142135623730951454746218587388284504413604736328125'
并检查它
import decimal
print(decimal.Decimal.from_float(2**(1/2))
# -> '1.4142135623730951454746218587388284504413604736328125'
需要时,g格式类型会切换为指数表示法。
TA贡献1877条经验 获得超6个赞
你在这里真正需要的是小数。Python float 不会允许您达到这样的精度。
In [28]: d= Decimal('1.00000000000000001')
In [29]: print d
1.00000000000000001
TA贡献2021条经验 获得超8个赞
获得具有全精度浮点数的字符串表示的一个简单解决方案是使用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。这也可以通过使用 枚举 1.0 附近的数字来检查np.nextafter,这会产生下一个更大/更小的可表示浮点值:
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 标准的一部分,这在这个用例中实际上是有益的。
我见过的另一种方法是使用"{:.17g}".format(x)基于g 格式说明符。格式化程序也会e在必要时从符号切换到固定符号,17 位数字应该总是足够的精度,但我还没有验证过。但在某些情况下,它可能会产生过多的数字。
添加回答
举报