Python中的错误答案

时间:2014-02-05 07:57:01

标签: python

我试图用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位数字错误,我做错了什么?

2 个答案:

答案 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

但是不知道你想要得到哪一个答案,而不想做数学,我不知道这是不是你想要的。