【发布时间】:2021-07-25 16:29:34
【问题描述】:
我想打印包含可变精度的浮点数。
我有多个数字,例如:
0.634564644534135499
0.0005462007746487777
0.028820785252590582
0.0018751147995774936
0.0075146048125540816
0.00046670455
我想使用 print 获得与输出相同的数字。我知道可以使用print("{:.19f}".format(0.0005462007746487777)) 固定小数位数,但我不想固定小数位数。因为不同的数字会有不同的小数位
代码
#!/usr/bin/env python3
number_1=0.634564644534135499
number_2=0.0005462007746487777
number_3=0.028820785252590582
number_4=0.0018751147995774936
number_5=0.0075146048125540816
number_6=0.00046670455
print("Number 1: ",number_1)
print("Number 2: ",number_2)
print("Number 3: ",number_3)
print("Number 4: ",number_4)
print("Number 5: ",number_5)
print("Number 6: ",number_6)
实际输出:
Number 1: 0.6345646445341355
Number 2: 0.0005462007746487777
Number 3: 0.028820785252590582
Number 4: 0.0018751147995774936
Number 5: 0.0075146048125540816
Number 6: 0.00046670455
所需输出:
Number 1: 0.634564644534135499
Number 2: 0.0005462007746487777
Number 3: 0.028820785252590582
Number 4: 0.0018751147995774936
Number 5: 0.0075146048125540816
Number 6: 0.00046670455
我不明白为什么 Number 2(精度更高)打印正确,但 Number 1 失去精度?
【问题讨论】:
-
这归结为python用于浮点十进制字符串表示的算法。它使用 David Gay 的算法来寻找不会改变其值的最短浮点表示。无法取回“您输入的数字”,因为许多可能的十进制文字将映射到实际的浮点表示。
-
您是否理解,从根本上说,您输入为浮点文字的许多十进制数根本无法表示?这归结为机器表示是二进制的,以及浮动对象的固定大小性质,这些对象基本上是 C double 的包装器。最重要的是
float对象是如何打印的问题。 -
为什么需要完全相同的数字?
-
@Daniel 我需要它们来进行测试。我有 2 个应用程序。一个 C++ 和一个 python(这是一个用于测试 C++ 不同功能的参考应用程序)。两个应用程序都在 json 消息中接收这些数字,并且都必须打印 json 消息的每个字段。 C++ 以正确的方式打印数字,而 python 有这个限制
-
@Saad_Khan:没有一种正确的方法。从某种意义上说,Python 更正确,因为它保证它使用最少的小数位。不同的 C++ 实现可以使用不同的方法并导致不同的结果。在比较结果时,您必须处理同一数字的不同表示。
标签: python python-3.x floating-point precision