Arrays 在python3中将浮点元组转换为数组时的精度损失
当我使用“f”类型代码将元组或浮点列表转换为数组时,我在准确性方面遇到了一些问题,但使用“d”类型代码时,它运行“正确” 例如: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
导入数组
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])
查看小数点后的远位。