列表中的乘法元素给出了奇怪的结果Python

时间:2013-10-21 01:33:05

标签: python list python-2.7

我有一个基本电阻值列表

BaseRes=[1.0,1.1,1.2,1.3,1.5,1.6,1.8,2.0,2.2,2.4,2.7,3.0,3.3,3.6,3.9,4.3,4.7,5.1,5.6,6.2,6.8,7.5,8.2,9.1]

然后,我想创建一个包含这些基值的列表,并将这些值乘以10:

Resistors = BaseRes
Resistors = Resistors+[res*10 for res in BaseRes]

输出:

Resistors
[1.0, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 2.0, 2.2, 2.4, 2.7, 3.0, 3.3, 3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 6.2, 6.8, 7.5, 8.2, 9.1, 10.0, 11.0, 12.0, 13.0, 15.0, 16.0, 18.0, 20.0, 22.0, 24.0, 27.0, 30.0, 33.0, 36.0, 39.0, 43.0, 47.0, 51.0, 56.0, 62.0, 68.0, 75.0, 82.0, 91.0]

正如你所看到的,这对我来说很好。但是,当我想添加基准电阻值的列表乘以100时,我会得到一些奇数值的几个值:

Resistors = Resistors+[res*100 for res in BaseRes]

输出:

 Resistors
[1.0, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 2.0, 2.2, 2.4, 2.7, 3.0, 3.3, 3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 6.2, 6.8, 7.5, 8.2, 9.1, 10.0, 11.0, 12.0, 13.0, 15.0, 16.0, 18.0, 20.0, 22.0, 24.0, 27.0, 30.0, 33.0, 36.0, 39.0, 43.0, 47.0, 51.0, 56.0, 62.0, 68.0, 75.0, 82.0, 91.0, 100.0, 110.00000000000001, 120.0, 130.0, 150.0, 160.0, 180.0, 200.0, 220.00000000000003, 240.0, 270.0, 300.0, 330.0, 360.0, 390.0, 430.0, 470.0, 509.99999999999994, 560.0, 620.0, 680.0, 750.0, 819.9999999999999, 910.0]

主要是110值,220值,510值和820值令我困惑。

我不明白这里发生了什么。

非常感谢任何帮助

2 个答案:

答案 0 :(得分:3)

虽然您所看到的是浮点表示中的舍入错误,但您可能会在此处进行修复。我推荐Python's decimal module,它旨在处理需要精确的人类数学而非快速二进制近似的情况。

from decimal import *
getcontext().prec = 3
resBase = [Decimal(x) for x in [1.0, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 
    2.0, 2.2, 2.4, 2.7, 3.0, 3.3, 3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 
    6.2, 6.8, 7.5, 8.2, 9.1]]
print [res * 100 for res in resBase]

输出:

[Decimal('100'), Decimal('110'), Decimal('120'), Decimal('130'), Decimal('150'), 
Decimal('160'), Decimal('180'), Decimal('200'), Decimal('220'), Decimal('240'), 
Decimal('270'), Decimal('300'), Decimal('330'), Decimal('360'), Decimal('390'), 
Decimal('430'), Decimal('470'), Decimal('510'), Decimal('560'), Decimal('620'), 
Decimal('680'), Decimal('750'), Decimal('820'), Decimal('910')]

答案 1 :(得分:0)

正如其他人所指出的,这是一个浮点问题。你可能想知道如何修复它。

尝试类似:

import math
Resistors = Resistors+[math.floor(res*100) for res in BaseRes]

我建议您阅读documentation for Python's math package以获取更多信息以及一些可以提供帮助的有用功能。快乐的编码!