长整数除以 10,结果在 Python 中不正确

A long integer when divided by 10, the result is not numerically correct in Python

我正在学习 Python 并练习 LeetCode 中的 LinkedList 问题。在此问题中,将添加 2 个以 LinkedList 格式给出的整数,每个节点中的每个数字,结果应拆分为具有每个数字的节点的 LinkedList。

在程序中,当我将 1000000000000000000000000000466 除以 10 时,得到的是 99999999999999991433150857216 而不是 100000000000000000000000000046,这是不正确的。我的第一个猜测是溢出,但我读到 python 根据数字的大小自动分配长整数。无法弄清楚我错过了什么。任何人都可以在这方面帮助我吗? 附上我的代码、测试用例和调试打印输出。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        def getNumber(p1: ListNode) -> int:
            number=0
            power=0
            while p1:
                number = number + (10**power * p1.val)
                p1 = p1.next
                power += 1
            return number
        num = getNumber(l1)+getNumber(l2)
        print(num)
        node = ListNode()
        head = node
        while True:
            newNode = ListNode()
            newNode.val = num%10
            node.next = newNode
            node = newNode
            num = int(num/10)
            print(num) #This output is given below
            if num ==0: break
        return head.next

测试输入: [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1], [5,6,4]

打印:

1000000000000000000000000000466
99999999999999991433150857216
9999999999999999583119736832
1000000000000000013287555072
100000000000000004764729344
10000000000000000905969664
1000000000000000117440512
100000000000000008388608
10000000000000000000000
1000000000000000000000
100000000000000000000
10000000000000000000
1000000000000000000
100000000000000000
10000000000000000
1000000000000000
100000000000000
10000000000000
1000000000000
100000000000
10000000000
1000000000
100000000
10000000
1000000
100000
10000
1000
100
10
1
0

罪魁祸首是:

num = int(num/10)

因为 num/10 是一个 IEE 754 浮点值,只有 48 位尾数,所以精度有限。您应该改用整数除法 num = num // 10.

演示:

num = 1000000000000000000000000000466
print(num, num //10, int(num/10))
1000000000000000000000000000466 100000000000000000000000000046 99999999999999991433150857216