如何打印浮点数的全精度

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


def check(x, y):

    print(type(x))

    print(type(y))

    print(x)

    print(y)

    if x == y:

        print "Yes"

现在当我打电话给 check(1.00000000000000001, 1.0000000000000002) 它时正在打印:


<type 'float'>

<type 'float'>

1.0

1.0

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


慕森王
浏览 188回答 3
3回答

桃花长相依

要获得完全精确和正确的格式,请执行以下操作format(2**(1/2), '.60g')&nbsp;# -> '1.4142135623730951454746218587388284504413604736328125'并检查它import decimalprint(decimal.Decimal.from_float(2**(1/2))# -> '1.4142135623730951454746218587388284504413604736328125'需要时,g格式类型会切换为指数表示法。

慕哥9229398

你在这里真正需要的是小数。Python float 不会允许您达到这样的精度。In [28]: d= Decimal('1.00000000000000001')In [29]: print d1.00000000000000001

宝慕林4294392

获得具有全精度浮点数的字符串表示的一个简单解决方案是使用json.dumps.JSON 序列化/反序列化必须确保往返是无损的,因此,实现会生成您正在寻找的字符串表示:import jsondef check(x,y):&nbsp; &nbsp; print(json.dumps(x))&nbsp; &nbsp; print(json.dumps(y))&nbsp; &nbsp; print("x == y is {}".format(x == y))In [1]: check(1.00000000000000001, 1.0000000000000002)1.01.0000000000000002x == y is FalseIn [2]: check(1e-300, 2e-300)1e-3002e-300x == y is FalseIn [3]: check(1e+300, 2e+300)1e+3002e+300x == y is False这也说明1.00000000000000001实际上是1.0。这也可以通过使用 枚举 1.0 附近的数字来检查np.nextafter,这会产生下一个更大/更小的可表示浮点值:&nbsp; &nbsp; 0.9999999999999994&nbsp; &nbsp; 0.9999999999999996&nbsp; &nbsp; 0.9999999999999997&nbsp; &nbsp; 0.9999999999999998&nbsp; &nbsp; 0.9999999999999999[*] 1.0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; 1.0000000000000002&nbsp; &nbsp; 1.0000000000000004&nbsp; &nbsp; 1.0000000000000007&nbsp; &nbsp; 1.0000000000000009&nbsp; &nbsp; 1.000000000000001&nbsp;另一个注意事项:json.dumps具有在某些情况下可能令人讨厌的功能:它甚至支持NaN和 +/- 无限值,即使它们不是 JSON 标准的一部分,这在这个用例中实际上是有益的。我见过的另一种方法是使用"{:.17g}".format(x)基于g 格式说明符。格式化程序也会e在必要时从符号切换到固定符号,17 位数字应该总是足够的精度,但我还没有验证过。但在某些情况下,它可能会产生过多的数字。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python