Arrays 在python3中将浮点元组转换为数组时的精度损失

Arrays 在python3中将浮点元组转换为数组时的精度损失,arrays,python-3.x,precision,Arrays,Python 3.x,Precision,当我使用“f”类型代码将元组或浮点列表转换为数组时,我在准确性方面遇到了一些问题,但使用“d”类型代码时,它运行“正确” 例如: 导入数组 a=(2.16,-22.4,95.12,-63.47,-0.021245.2) b=数组。数组('f',a) 印刷品(b) #数组('f',[2.160000858306885,-22.39999618530273,95.12000274658203,-63.470001220703125,-0.019999995529651641245.199951171

当我使用“f”类型代码将元组或浮点列表转换为数组时,我在准确性方面遇到了一些问题,但使用“d”类型代码时,它运行“正确”

例如:

导入数组
a=(2.16,-22.4,95.12,-63.47,-0.021245.2)
b=数组。数组('f',a)
印刷品(b)
#数组('f',[2.160000858306885,-22.39999618530273,95.12000274658203,-63.470001220703125,-0.019999995529651641245.199951171875])
c=数组。数组('d',a)
印刷品(c)
#数组('d',[2.16,-22.4,95.12,-63.47,-0.021245.2])
如您所见,数组c包含与元组a相同的数字,但数组b存在准确性问题


然而
类型(b[0])
类型(c[0])
都会导致

在这里,您可能会怀疑,实际上没有准确度损失,这是一种“错误”的情况

文字值
2.16
没有浮点数的精确表示;解析后,它存储为
0x400147AE147AE148
,因为Python(请参见
Numbers.real
)表示浮点数

然后将该值转换为
0x400A3D71
(如果
f
)或保持不变(如果
d
)。这些值对应于2.160000858306884765625和2.1600000000000014210854715202,这两个值都是可以得到的文字
2.16
的最精确表示。原始
2.16
的精度损失是不可避免的,因为
2.16
根本不存在精确值


您在字符串表示中看到的是解释器将基础float/double四舍五入到一个接近的值,如果由于该四舍五入导致精度损失的话。在这两种情况下,基础值尽可能接近
2.16
,只是它们的字符串表示形式不同。

Hi!你能补充一些你期望的细节吗?你的帖子似乎还没有结束。我希望数组“b”的结果和数组“c”一样。事实上,到double或float的两种转换都有精度问题,但在double的情况下,你看不到它们,因为输出的格式不同。尝试
print({:4.20}).format(b[0])
print({:4.20}).format(c[0])
查看小数点后的远位。