【发布时间】:2020-03-25 19:42:21
【问题描述】:
案例 1:
for num in [.1, .2, .3, .4, .5, .6, .7, .8, .9,]:
print(format(num, ".50f"))
0.10000000000000000555111512312578270211815834045410
0.20000000000000001110223024625156540423631668090820
0.29999999999999998889776975374843459576368331909180
0.40000000000000002220446049250313080847263336181641
0.50000000000000000000000000000000000000000000000000
0.59999999999999997779553950749686919152736663818359
0.69999999999999995559107901499373838305473327636719
0.80000000000000004440892098500626161694526672363281
0.90000000000000002220446049250313080847263336181641
如预期的那样不精确(.5 除外)。
案例 2:
for num in [1., 2., 3., 4., 5., 6., 7., 8., 9.]:
print(format(num, ".50f"))
1.00000000000000000000000000000000000000000000000000
2.00000000000000000000000000000000000000000000000000
3.00000000000000000000000000000000000000000000000000
4.00000000000000000000000000000000000000000000000000
5.00000000000000000000000000000000000000000000000000
6.00000000000000000000000000000000000000000000000000
7.00000000000000000000000000000000000000000000000000
8.00000000000000000000000000000000000000000000000000
9.00000000000000000000000000000000000000000000000000
完美的精度 - ???
众所周知,在计算中不存在完美的浮点整数:所有浮点数都以二进制基数表示,精度随着位大小的增加而增加(float32、float64 等)。那么上面的案例 2 是怎么回事呢?即使对于".1000f",零仍然存在,基本上意味着无限精度。此外,0.5 也以某种方式完美呈现。
如果format 不能强制 Python 打印一个浮点数的“真”值,那么什么可以呢?
尝试过的替代方案:
format(round(num, 50), ".50f")format(numpy.float128(num), ".50f")format(round(numpy.float128(num), 50), ".50f")format("%.50f" % num)"{:.50f}".format(num))f"{num:.50f}"
接受的答案:澄清问题中假设的错误前提;实际问题的答案在问题本身之内 - 使用 format 显示真实数值。
【问题讨论】:
-
这背后的戈拉是什么?您真的需要显示一个包含 50 个甚至 10 个零的值吗?
-
@azro Yes,有时——但我更感兴趣的是为什么 Python 会在这方面产生误导以及如何规避它
-
为什么你认为第二组不能用浮点数精确表示?
-
我不认为你已经明白这告诉你什么。 3 和 5 可以精确表示,即使它们不是 2 的幂。
标签: python floating-point precision floating-accuracy