我试图用Python解决这个问题。 (10 ** 22 + 1)/ 89这给了我这个答案:1.1235955056179775e + 20 所以我使用print语句来获取完整数字“%1.1f”%x,我得到这个数字: 112359550561797750784.0
这是错的。当你将这个答案乘以89时,你得不到10 ^ 22 + 1,但是得到了9999999999999999819776。试验给出正确答案为112359550561797752809,当乘以89得到精确的10 ^ 22 + 1.
我的问题是,如果我的答案的最后4位数字错误,我做错了什么?
答案 0 :(得分:7)
这就是浮点数学的工作原理。当你用小数除以1时,得到
0.3333333333333333...
你必须在某个时候切断它:
0.3333333333333333
然后当你乘以3:
0.9999999999999999
你没有得到1.舍入错误不可避免地累积。它在Python使用的二进制浮点数学中是相同的。即使结果是一个整数(它是(10 ** 22 + 1)/ 89),浮点表示只能保留这么多数字,所以巨大的数字最终会失去一些准确性。
如果要在整数数学中执行此操作,可以使用//
运算符:
>>> ((10**22 + 1) // 89) * 89 == 10**22 + 1
True
如果结果不是整数, //
将取代结果:
>>> 5 // 3
1
>>> (5 // 3) * 3
3
与浮点不同,Python的整数表示将保留每个数字。不幸的是,这只适用于整数,因为我们无法将sqrt(2)或pi等数字的每个数字都放入有限的RAM中。
答案 1 :(得分:0)
您想要获得哪个号码?
如果您使用数学模块,您可以这样做:
import math
e = pow(10, 22) + 1
a = e / 89
这给了我112359550561797752809L
但是不知道你想要得到哪一个答案,而不想做数学,我不知道这是不是你想要的。