2014-02-05 118 views
0

我试图在Python中解决这个问题。 (10 ** 22 + 1)/ 89,给了我这样的回答:1.1235955056179775e + 20 于是我就用print语句来获得完整的数字 “%1.1F” %x和我得到这个号码: 112359550561797750784.0Python中的错误答案

这是错的。当你把这个答案与89相乘时,你没有得到10^22 + 1,但是你得到了9999999999999999819776.有点玩的&试验给了我正确答案112359550561797752809,当它乘以89得到确切的10^22 + 1.

我的问题,我做错了什么,我的答案的最后4位数是错的?

+2

http://docs.python.org/2/tutorial/floatingpoint.html – Darek

+2

如果你使用整数除法('//'而不是'/'),你会得到正确的答案 – mhlester

+0

另外值得注意的是,'float(112359550561797752809)== 112359550561797752809'说错了! – mhlester

回答

7

这就是浮点运算的工作原理。当您在小数分1 3,你

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中。

+0

非常感谢。这解决了这个问题。 – user3274191

0

你试图得到哪个数字?

如果用数学模块,你可以这样做:

import math 
e = pow(10, 22) + 1 
a = e/89 

这给了我112359550561797752809L

但不知道你的答案你正在试图获得,而不是想要做的哪一个数学,我不知道这是你在找什么。

+2

你使用的是Python 2,并且使用内置的'pow'而不是'math.pow'。如果你在Python 3中,'/'会给你一个浮点结果。如果你正在使用'math.pow',那也会给你一个浮点结果。 – user2357112

+0

是的,我并没有完全明白他们在问什么,但我认为我会给它一个镜头。 – DuckPuncher