在Python3中将一个float的元组转换为一个数组时的精度损失

时间:2019-04-30 09:21:45

标签: arrays python-3.x precision

当我将元组或浮点列表转换为带有'f'类型代码的数组时,在准确性上存在一些问题,但是使用'd'类型代码将其“正确”运行。

例如:

import array

a = (2.16, -22.4, 95.12, -63.47, -0.02, 1245.2)
b = array.array('f', a)
print(b)
# array('f', [2.1600000858306885, -22.399999618530273, 95.12000274658203, -63.470001220703125, -0.019999999552965164, 1245.199951171875])

c = array.array('d', a)
print(c)
# array('d', [2.16, -22.4, 95.12, -63.47, -0.02, 1245.2])

如您所见,数组c包含与元组a相同的数字,但是数组b存在精度问题。

但是type(b[0])type(c[0])都产生<class 'float'>

1 个答案:

答案 0 :(得分:1)

实际上,您可能会怀疑准确性没有损失,这是“ Representation Error”的情况。

文字值2.16没有精确表示为浮点数;解析后,它存储为0x400147AE147AE148,因为Python always uses double precision(请参阅Numbers.real)代表浮点数。

然后将值转换为0x400A3D71(在f的情况下)或保持不变(在d的情况下)。这些值对应于2.1600000858306884765625和2.16000000000000014210854715202,这两个值都是人们可以获得的文字2.16的最准确表示。原始2.16的精度损失是不可避免的,因为2.16根本就不存在作为精确值。

在字符串表示形式中看到的是,如果由于舍入is considered acceptable而导致精度损失,则解释器会将基础float / double舍入到接近值。在两种情况下,基础值都尽可能接近2.16,只是它们的字符串表示形式不同。