2016-08-03 43 views
-3

有人可以解释我为什么我没有得到166.9(我知道有一个round()函数)我只是想了解。 :)Python3奇怪的浮动舍入

>>> 165.0 + 1.45 + 0.45 
166.89999999999998 
+6

因为[浮点运算被打破(http://stackoverflow.com/q/588004/5647260) – Li357

+0

@JonathonReinhart我做到了,因此您的评论 – Li357

+0

的upvotes @JonathonReinhart这真的很奇怪,我的标志选项是灰色的所以我肯定标记为重复 – Li357

回答

0

这是因为在计算机中数字以二进制形式表示。这不仅仅是Python的问题,而是一般的电脑问题。

+0

我的2€calc可以处理这个计算...并且这个simpe c程序找到了正确的答案:#include int main() { printf(“%f \ n”,165.0 + 1.45 + 0.45); return 0; } – hanoo

+0

是的,自然。查看有关此主题的链接。简而言之,您的计算器在内部也有二进制形式的数字,并且具有像内部代表的例如1.45的数字。为1.4499999999999999999。但他没有太多地方向你展示他的内部号码,他将它围绕并在显示器上显示1.45。但是计算机在内存上有更多的空间,他不会为你整理它,所以如果没有必要的话,他的二进制形式的准确性更高,并且不会对它进行调整。矛盾的是,更便宜的设备,它似乎对我们来说更加准确,但内部却不是。 –

+0

你的例子很好,但是你必须知道,''%f \ n“'意味着什么格式。试试这个格式为'“%.30f \ n”'。它将有三十个小数点。结果是:166.899999999999977262632455676794。整个程序:'#include int main(){printf(“%。30f \ n”,165.0 + 1.45 + 0.45);返回0; }' –

0

浮点数在python中存储在64位。 1位是符号,52位是尾数,11位是指数。要从这3个组件得到小数值,计算机将做*尾数* 2 ^指数。

并非所有的数字都可以完美地存储在这个表单中。只有52位来存储号码。例如,11.3不能完美地存储在这个表单中,你可以看到这个数字的确切值。

from decimal import Decimal 
print(Decimal(11.3)) 

当您添加165.0 + 1.45 + 0.45。

>>> print(Decimal(165)) 
165 
>>> print(Decimal(1.45)) 
1.4499999999999999555910790149937383830547332763671875 
>>> print(Decimal(0.45)) 
0.450000000000000011102230246251565404236316680908203125 

你实际上并没有添加这些确切的值。

有关浮点数系统的更多信息,请访问Wikipedia