如何在Python中显示真实的数值?

Ove*_*gon 2 python floating-point precision floating-accuracy

情况1

for num in [.1, .2, .3, .4, .5, .6, .7, .8, .9,]:
    print(format(num, ".50f"))
Run Code Online (Sandbox Code Playgroud)
0.10000000000000000555111512312578270211815834045410
0.20000000000000001110223024625156540423631668090820
0.29999999999999998889776975374843459576368331909180
0.40000000000000002220446049250313080847263336181641
0.50000000000000000000000000000000000000000000000000
0.59999999999999997779553950749686919152736663818359
0.69999999999999995559107901499373838305473327636719
0.80000000000000004440892098500626161694526672363281
0.90000000000000002220446049250313080847263336181641
Run Code Online (Sandbox Code Playgroud)

不精确,正如预期的那样(除了.5)。


案例2

for num in [1., 2., 3., 4., 5., 6., 7., 8., 9.]:
    print(format(num, ".50f"))
Run Code Online (Sandbox Code Playgroud)
1.00000000000000000000000000000000000000000000000000
2.00000000000000000000000000000000000000000000000000
3.00000000000000000000000000000000000000000000000000
4.00000000000000000000000000000000000000000000000000
5.00000000000000000000000000000000000000000000000000
6.00000000000000000000000000000000000000000000000000
7.00000000000000000000000000000000000000000000000000
8.00000000000000000000000000000000000000000000000000
9.00000000000000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

完美的精度 - ???


众所周知,计算中不存在完美的浮点整数:所有浮点都以二进制基数表示,其精度取决于位大小(float32float64等)。那么上面的案例2是怎么回事呢?即使对于 ,零仍然存在".1000f",基本上意味着无限的精度。此外,0.5也以某种方式完美地表现出来。

如果format不能强制 Python 打印浮点数的“真”值,那么什么可以呢?


尝试的替代方案

  1. format(round(num, 50), ".50f")
  2. format(numpy.float128(num), ".50f")
  3. format(round(numpy.float128(num), 50), ".50f")
  4. format("%.50f" % num)
  5. "{:.50f}".format(num))
  6. f"{num:.50f}"

接受的答案:澄清问题中假设的错误前提;实际问题的答案就在问题本身内 - 用于format显示真实的数值。

Pat*_*han 5

在常用的格式中,例如 IEEE 754 64 位二进制浮点数,所有有限浮点数都是二进制分数,形式为 A*2 B形式的数字,其中 A 和 B 都是有符号整数。

\n\n

当然,有限格式只能表示二进制分数的有限子集。A 中的有效位数和 B 的范围均受格式限制。对于正常(非次正常)IEEE754 64 位二进制,A 的有效位不能超过 53 个,并且,当非零 A 标准化为 1.x 形式时,B 必须在 [\xe2\x88\ x921022,1023]。

\n\n

0.5 可以精确表示,因为它是 1*2 -1。\n类似地,诸如 5.0/8.0 (5*2 -3 ) 之类的数字也是精确的。

\n\n

在 64 位二进制浮点中,可以准确表示适合 32 位二进制的所有整数,这解释了问题中的第二个表。9 是 9*2 0

\n\n

对于输出端值得注意的是,每个二进制分数都有一个终止十进制扩展。这是 2 是 10 的因数的结果。打印足够的数字,您将得到浮点数的精确值。

\n