案例 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
完美的精度 - ???
众所周知,在计算中不存在完美的 float 整数:所有 float 均以二进制基数表示,精度根据位数增加(float32、float64 等)。那么上面的案例 2 是怎么回事呢?即使对于 ".1000f",零仍然存在,基本上意味着无限精度。此外,0.5 也以某种方式完美呈现。
如果 format 不能强制 Python 打印 float 的“真”值,那还有什么可以呢?
尝试的替代方案:
format(round(num, 50), ".50f")format(numpy.float128(num), ".50f")format(round(numpy.float128(num), 50), ".50f")格式("%.50f"% num)"{:.50f}".format(num))f"{num:.50f}"
ACCEPTED ANSWER:澄清问题中假设的错误前提;实际问题的答案在问题本身内 - 使用 format 显示真实数值。
请您参考如下方法:
在常用格式中,例如 IEEE 754 64 位二进制 float ,所有有限 float 都是二进制分数,形式为 A*2B 的数字,其中 A 和 B 都是有符号整数.
当然,有限格式只能表示二进制分数的有限子集。 A 中的有效位数和 B 的范围都受格式限制。对于普通(非次正规)IEEE754 64 位二进制,A 的有效位不能超过 53,并且非零 A 标准化为 1.x 形式,B 必须在 [−1022, 1023] 范围内.
0.5 可以精确表示,因为它是 1*2-1。 同样,5.0/8.0 (5*2-3) 等数字是准确的。
在 64 位二进制 float 中,所有适合 32 位二进制数的整数都可以精确表示,这解释了问题中的第二个表。 9 是 9*20。
输出端值得注意的是,每个二进制小数都有一个终止十进制扩展。这是 2 是 10 的因数的结果。打印足够多的数字,您将得到 float 的精确值。
