网易首页 > 网易号 > 正文 申请入驻

0.1+0.2等于0.3吗

0
分享至

前言

去互联网金融或电商行业的公司面试时,一般都会遇类似“ 0.1+0.2 等于 0.3吗?”这道题,对于非科班出身的前端人是一道送命题,有些知道 0.1+0.2 不等于 0.3,但是继续深问为什么,就无法很清晰地回答。

本专栏总结一下回答 0.1+0.2 不等于 0.3 的思路,在回答之前要先弄清楚 0.1+0.2 的计算过程。

0.1+0.2 的计算过程计算过程

十进制转成二进制

在JS内部所有的计算都是以二进制方式计算的。 所以运算 0.1+ 0.2 时要先把 0.1和 0.2 从十进制转成二进制。

  • 0.1转化成二进制的算法:
  • 0.1*2=0.2======取出整数部分0
  • 0.2*2=0.4======取出整数部分0
  • 0.4*2=0.8======取出整数部分0
  • 0.8*2=1.6======取出整数部分1
  • 0.6*2=1.2======取出整数部分1

接下来会无限循环

  • 0.2*2=0.4======取出整数部分0
  • 0.4*2=0.8======取出整数部分0
  • 0.8*2=1.6======取出整数部分1
  • 0.6*2=1.2======取出整数部分1
  • 所以0.1转化成二进制是:0.0001 1001 1001 1001......

0.2转化成二进制的算法:

  • 0.2*2=0.4======取出整数部分0
  • 0.4*2=0.8======取出整数部分0
  • 0.8*2=1.6======取出整数部分1
  • 0.6*2=1.2======取出整数部分1

接下来会无限循环

  • 0.2*2=0.4======取出整数部分0
  • 0.4*2=0.8======取出整数部分0
  • 0.8*2=1.6======取出整数部分1
  • 0.6*2=1.2======取出整数部分1
  • 所以0.2转化成二进制是:0.0011 0011 0011 0011......

这里要注意 0.1 和 0.2 转成的二进制是无穷的。另外在现代浏览器中是用浮点数形式的二进制来存储二进制,所以还要把上面所转化的二进制转成浮点数形式的二进制。

转成浮点数

浮点数分为单精度对应32位操作系统和双精度对应64位操作系统。目前的操作系统大多是64位操作系统,故这里只解释一下二进制如何转成双精度浮点数的二进制。

双精度浮点数用1位表示符号位,11位表示指数位,52位表示小数位,如下图所示:

符号位:正数为0,负数为1;

指数位:阶数+偏移量,阶数是:2^{e-1}-12e−1−1,ee为阶码的位数。偏移量是把小数点移动到整数位只有11时移动的位数,正数表示向左移,负数表示向右移;

小数位:即二进制小数点后面的数。

接下来把0.10.10.1转成的二进制0.0001100110011001......0.0001 1001 1001 1001......0.0001100110011001......转成浮点数形式的二进制。

先要把小数点移动到整数位只有1,要向右移动4位,故偏移量为−4,通过指位数的计算公式211−1−1−4=1019 把1019转为二进制为1111111011,不够11位要补零,最终得出指位数为01111111011;

小数位为1001 1001 1001......100110011001......,因为小数位只能保留52位,第53位为1故进1

转换结果如下图所示:

同理,再把 0.2 转成的二进制0.0011 0011 0011 0011...... 转成浮点数形式的二进制,转换结果如下图所示:

浮点数相加

浮点数相加时,需要先比较指位数是否一致,如果一致则小数位直接相加,如果不一致,要先把指位数调成一致的,指位数小的向大的调整。

为了行文方便,把0.1转成的浮点数称为0.1,把0.2转成的浮点数称为0.2。

0.1的指数位是1019 ,0.2的指数位是1020 。故要把0.1的指数位加1,即把0.1的小数点向左移动1位,另外浮点数的整数位固定为1,过程如下所示

导致0.1的小数位变成如下所示:

现在0.1和0.2的指数位相同了,把小数位直接相加。

会发现现在的小数位多出了一位,超出了52位,故要把小数位最后一位截掉,小数位最后一位是1,故要进1,如下所示:

截掉小数位的最后一位相当把小数点向左移了一位,故指数位要加1,此时的指数是0.2的指数1021 ,加1后变成1021 ,转成二进制为01111111101 ,那么相加后的浮点数如下所示:

浮点数转成十进制

,s是符号位为0或1,e为浮点数指数位转成十进制的值,i表示小数位从左到右的位数,第一位 i=1 ,表示每一位的值为0或1。

二进制浮点数计算结束后,把结果(二进制的浮点数)转成十进制,其转换公式为

那么按着公式把二进制的浮点数转成十进制:

结果如下所示:

0.3000000000000000444089209850062616169452667236328125

由于精度问题,只取到0.30000000000000004。

答案

0.1+0.2 不等于 0.3 ,因为在 0.1+0.2 的计算过程中发生了两次精度丢失。第一次是在 0.1 和 0.2 转成双精度二进制浮点数时,由于二进制浮点数的小数位只能存储52位,导致小数点后第53位的数要进行为1则进1为0则舍去的操作,从而造成一次精度丢失。

第二次在 0.1 和 0.2 转成二进制浮点数后,二进制浮点数相加的过程中,小数位相加导致小数位多出了一位,又要让第53位的数进行为1则进1为0则舍去的操作,又造成一次精度丢失。最终导致 0.1+0.2 不等于0.3 。

拓展

若你回答出来,面试官还可能继续问你:“ 0.1+0.2 不等于 0.3 会引起那些BUG?”

可以这样回答:“ 会引起统计页面展示错乱的BUG,还有 300.01 优惠300 元后,支付金额不足0.01 元等类似的BUG。”

还可能继续问道:“怎么解决 0.1+0.2 不等于 0.3 这个问题”。

可以这样回答:“可以用Math.js数学计算库来解决,或者用toFixed()给计算结果四舍五入,但是toFixed()在chrome或者火狐浏览器下四舍五入也有精度误差。

可以用Math.round来解决精度误差,比如要把 2.55 四舍五入保留 1 位小数,先把 2.55∗10 得到 25.5 ,再用Math.round取整25.5 ,会得到25,再把 25÷10 得到 2.5 ,就这样间接实现了四舍五入。可以用Math.pow来做个简单的封装Math.round(Math.pow(10, m) * number) / Math.pow(10, m),其中number是要四舍五入的数,m是保留几位小数。

作者:张蓉铭

来源:爱创乐育

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
公司宣布破产,每人拿了7w的补偿金,就在大家收拾准备走人时,结果老板说:有个新公司谁愿意去?工资翻倍,但必须自愿放弃赔偿

公司宣布破产,每人拿了7w的补偿金,就在大家收拾准备走人时,结果老板说:有个新公司谁愿意去?工资翻倍,但必须自愿放弃赔偿

不二大叔
2026-05-31 21:25:29
普京首次宣称俄乌战争接近结束!承认乌克兰更容易打击俄本土

普京首次宣称俄乌战争接近结束!承认乌克兰更容易打击俄本土

项鹏飞
2026-05-30 16:12:33
重庆一凶宅以39万余元起价被法拍,拍卖公司:屋内曾发生非正常死亡事件

重庆一凶宅以39万余元起价被法拍,拍卖公司:屋内曾发生非正常死亡事件

极目新闻
2026-05-31 12:12:29
《主角》硬塞俩原著没有的角色又光速弄死,不是神改编是纯注水

《主角》硬塞俩原著没有的角色又光速弄死,不是神改编是纯注水

阿废冷眼观察所
2026-06-01 05:59:36
5月31日晚间沪深上市公司重大事项公告最新快递

5月31日晚间沪深上市公司重大事项公告最新快递

新浪财经
2026-05-31 19:32:53
1979年对越反击战,我军至少有200个师,为何让一批新兵上前线?

1979年对越反击战,我军至少有200个师,为何让一批新兵上前线?

雍亲王府
2026-06-01 06:45:03
5月还没结束,朱玲玲与罗康瑞私下状态被曝,婚变传闻该真相大白

5月还没结束,朱玲玲与罗康瑞私下状态被曝,婚变传闻该真相大白

姩姩有娱
2026-05-29 16:27:47
官方:巴黎边锋克瓦拉茨赫利亚当选本赛季欧冠最佳球员

官方:巴黎边锋克瓦拉茨赫利亚当选本赛季欧冠最佳球员

懂球帝
2026-05-31 23:16:08
从“玻璃人”到国脚:陈涛用一年,救了戴伟浚的职业生涯

从“玻璃人”到国脚:陈涛用一年,救了戴伟浚的职业生涯

体坛狗哥
2026-05-31 21:43:54
我48岁,无意间撞破了女邻居的秘密,她上来就把我扑倒了

我48岁,无意间撞破了女邻居的秘密,她上来就把我扑倒了

木子言故事
2026-06-01 06:20:08
罗德里戈社媒晒收到的C罗签名球衣,配文“GOAT”表达敬意

罗德里戈社媒晒收到的C罗签名球衣,配文“GOAT”表达敬意

懂球帝
2026-05-31 12:37:16
社保严查来了!历史欠费怎么办?记住:这3种情况,对号入座

社保严查来了!历史欠费怎么办?记住:这3种情况,对号入座

细说职场
2026-05-31 11:55:57
莫迪绝望!短短半月不到,他就见识到了,印度的无能,中国的高明

莫迪绝望!短短半月不到,他就见识到了,印度的无能,中国的高明

伴史缘
2026-05-31 15:07:15
特朗普32岁女儿访泰姬陵,牵手阿拉伯裔丈夫,私人旅行却享高规格

特朗普32岁女儿访泰姬陵,牵手阿拉伯裔丈夫,私人旅行却享高规格

译言
2026-05-31 07:25:42
谢霆锋曾回应与王菲“世纪牵手”:很自然没讨论,王菲很单纯

谢霆锋曾回应与王菲“世纪牵手”:很自然没讨论,王菲很单纯

扒虾侃娱
2026-05-31 15:06:39
王凤英:在长城年薪500万没股份,到小鹏仅2个月,手握股权近亿元

王凤英:在长城年薪500万没股份,到小鹏仅2个月,手握股权近亿元

大鱼简科
2026-05-31 10:02:57
浙江,32岁男子与11岁女孩交往,强行发生2次关系后致对方患性病

浙江,32岁男子与11岁女孩交往,强行发生2次关系后致对方患性病

雪峰说法
2026-05-31 17:20:32
苏芒的维权之举引发争议!有博主站台,直言“其实她也挺无奈”

苏芒的维权之举引发争议!有博主站台,直言“其实她也挺无奈”

火山詩话
2026-05-29 09:43:36
深夜男子酒驾连撞两车 涉嫌危险驾驶已被刑拘

深夜男子酒驾连撞两车 涉嫌危险驾驶已被刑拘

上观新闻
2026-05-31 20:24:23
医生发现:早期脑梗不是头晕,而是频繁出现这5个异常,要警惕!

医生发现:早期脑梗不是头晕,而是频繁出现这5个异常,要警惕!

芹姐说生活
2026-05-31 12:48:00
2026-06-01 08:04:49
爱创乐育
爱创乐育
努力成为别人心中的大神
30文章数 134关注度
往期回顾 全部

财经要闻

网红驱蚊产品,标注化妆品竟含农药成分

头条要闻

媒体:中国防长不去"香会" 主办方的意图落空了

头条要闻

媒体:中国防长不去"香会" 主办方的意图落空了

体育要闻

阿森纳用最悲壮的方式,成就了巴黎王朝

娱乐要闻

朱军退休,正义虽迟但到,女方受惩

科技要闻

戴尔诺基亚又回来了!AI重估老牌科技公司

汽车要闻

900V+3.2秒破百 领克10+&领克10上市16.99万元起

态度原创

手机
教育
艺术
旅游
公开课

手机要闻

荣耀600系列、OPPO Reno16系列首销成绩出炉

教育要闻

新能源专业到底好不好就业

艺术要闻

李讷刘思齐邵华童年照曝光!"红二代"狂草热榜,大草为何难写好?

旅游要闻

热门项目一票难求,“逛工厂”火爆出圈

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版