在Python中提取数字的小数部分
我正在写一个函数,用来从一个数字中提取小数部分。先不管异常和它的语法,我是在2.5.2版本(默认的Leopard版本)上工作。我的函数现在还没有处理0的情况。我的问题是,这个函数在处理某些数字时会出现随机错误,我不明白原因是什么。代码后面我会贴出错误的输出。
函数:
def extractDecimals(num):
try:
if(num > int(num)):
decimals = num - int(num)
while(decimals > int(decimals)):
print 'decimal: ' + str(decimals)
print 'int: ' + str(int(decimals))
decimals *= 10
decimals = int(decimals)
return decimals
else:
raise DecimalError(num)
except DecimalError, e:
e.printErrorMessage()
异常类:
class DecimalError(Exception):
def __init__(self, value):
self.value = value
def printErrorMessage(self):
print 'The number, ' + str(self.value) + ', is not a decimal.'
当我输入数字1.988时,出现的错误输出是:
decimal: 0.988
int: 0
decimal: 9.88
int: 9
decimal: 98.8
int: 98
decimal: 988.0
int: 987
decimal: 9880.0
int: 9879
decimal: 98800.0
int: 98799
decimal: 988000.0
int: 987999
decimal: 9880000.0
int: 9879999
decimal: 98800000.0
int: 98799999
decimal: 988000000.0
int: 987999999
decimal: 9880000000.0
int: 9879999999
decimal: 98800000000.0
int: 98799999999
decimal: 988000000000.0
int: 987999999999
decimal: 9.88e+12
int: 9879999999999
decimal: 9.88e+13
int: 98799999999999
decimal: 9.88e+14
int: 987999999999999
9879999999999998
我不知道为什么会出现这个错误。希望你们能帮我解决这个问题。
5 个回答
正如其他人已经提到的,你遇到的问题是因为浮点数的表示不够精确。
你可以试试用Python的 Decimal
来运行你的程序。
from decimal import Decimal
extractDecimals(Decimal("0.988"))
正如之前提到的,浮点数和小数并不完全相等。你可以通过使用取模运算符来观察这一点,方法如下:
>>> 0.988 % 1
0.98799999999999999
>>> 9.88 % 1
0.88000000000000078
>>> 98.8 % 1
0.79999999999999716
这个操作会给出除以1的余数,也就是小数部分。
问题在于,二进制的浮点数不能完全准确地用十进制表示。想了解更多,可以看看这个链接:为什么十进制数字不能在二进制中被准确表示?