在Python中提取数字的小数部分

1 投票
5 回答
3296 浏览
提问于 2025-04-15 15:21

我正在写一个函数,用来从一个数字中提取小数部分。先不管异常和它的语法,我是在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 个回答

1

正如其他人已经提到的,你遇到的问题是因为浮点数的表示不够精确。

你可以试试用Python的 Decimal 来运行你的程序。

from decimal import Decimal
extractDecimals(Decimal("0.988"))
1

正如之前提到的,浮点数和小数并不完全相等。你可以通过使用取模运算符来观察这一点,方法如下:

>>> 0.988 % 1
0.98799999999999999
>>> 9.88 % 1
0.88000000000000078
>>> 98.8 % 1
0.79999999999999716

这个操作会给出除以1的余数,也就是小数部分。

5

问题在于,二进制的浮点数不能完全准确地用十进制表示。想了解更多,可以看看这个链接:为什么十进制数字不能在二进制中被准确表示?

撰写回答