长整数除以 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
我正在学习 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