javascript - js中,浮点数值的计算,如何理解舍入误差?
天蓬老师
天蓬老师 2017-04-11 11:29:15
0
5
711

0.1+0.2 --> 0.30000000000000004
有大神能通俗易懂的解释下这是为啥么。。。书上写的好高大上,实在是看不懂

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

reply all(5)
迷茫

二进制表示小数有限制。
比如:0.1(十进制) = 0.0001100110011001(16位二进制)
0.1=1/2*0+1/2^2*0+1/2^3*0+1/2^4*1+1/2^5*1+1/2^6*0+1/2^7*0+1/2^8*1......
你把红色的连起来就是0.1的二进制部分,但是在有限长度下加起来怎么也不是0.1。


再举个不太恰当的例子。
把分数当作十进制小数来看,把小数当作二进制数来看,并且假设只能有10位长度。
1/3只能用小数0.3333333333(假设只能有10位)来表示接近1/3;
1/3+1/3是2/3,但是用小数表示就是0.3333333333+0.3333333333=0.6666666666;再转化为分数是19999999998/30000000000
而2/3则是20000000000/30000000000
误差就出来了。

小葫芦

0~1 之间的小数有无穷多个,但是如果用8个bit表示一个小数,只能表示256个不同的浮点数。

如果用 0000 0000 表示 0 0000 0001 表示 1/255 。。。 1111 1111 表示 1。
那如果我需要保存 1/256该怎么办呢?就只能把其近似为 1/255 保存为 0000 0001.所以 1/256+1/256 (0000 0001 + 0000 0001 = 0000 0010) 变成了1/256+1/256=2/255

在现实中,其实使用 64bit表示 约-10e-308 ~ 10 e308 范围内的所有浮点数。可是这之间的浮点书有无穷多个。
64bit只能分成有限中情况。于是有些输入的浮点数在计算机内保存的只是其近似值。于是。。。。

Ty80

可以参考我以前写的文章 http://www.cnblogs.com/zichi/...

简单点说就是 0.1 和 0.2 相加在计算机内都需要转为二进制,但是转为二进制后这两个数都是无限长的,于是相加就有精度损失了

刘奇

你可以简单理解为浮点数计算的时候精度会丢失。至于为什么。

可参考https://www.zhihu.com/questio...

PHPzhong

各种计数方式都会存在精度的问题你可以类比下面这种:
分数:
1/3 + 1/3 +1/3 = 1
将1/3换成小数时0.33333...(循环)
那么
0.33333...(循环) + 0.33333...(循环) + 0.33333...(循环) = 0.99999...(循环)
或许会对你理解有些帮助

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!