当我将一个元组或浮点列表转换为带有'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'>
。
实际上,你可能怀疑的方式没有准确性损失,这是“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
一样接近,因为它们在两种情况下都可能获得,只是它们的字符串表示不同。