美文网首页
JavaScript | 几道简单的算术题

JavaScript | 几道简单的算术题

作者: cemcoe | 来源:发表于2020-03-06 18:08 被阅读0次

看几道小学算术题:
[1]. 0.1 + 0.2 === 0.3
[2]. 99999999999999999999 === 100000000000000000000

等号两边是相等的吗?

在 js 中这两个简单的数学题是有违认知的。
口说无凭,试一试

这里放截图


测试结果

从结果可以看出,第一个算术题是不等的,而第二个算术题竟然是正确的。我的数学观崩塌了。。。

我没读过多少书,你他喵不要骗我呀。

两个数明明不一样,咋就相等了勒?

这是为什么,难道是 js 的问题,运用控制变量法,换一个编程语言碰一碰。

Python3 的测试结果如图:


Python3 测试结果

这俩儿货莫非是串通好的?

那么,从 Python3 的测试结果来看,可以推测发生这个状况是与具体的编程语言无关的。那这口锅谁来背?


搜索 一下,看来问这道题的人有很多呀。

622000000

嗯,这个问题其实会涉及到大学学的《计算机组成原理》这门课的部分知识。

往简单了的解释就是:遵循 IEEE 754 标准的语言都有这个问题。这个锅应该它来背。

往复杂了说,这里面牵扯到进制转换和对阶运算。精度缺失就发生在这两个阶段,因为标准位数的限制,0.1 和 0.2 在转换成二进制数时,多余的位会被截胡,这是已经就会损失一部分精度。再者,在不同指数位数的数字间进行运算时,需要先进行对阶运算,这个操作也是会有精度损失的。


知道了问题产生的原因,那么如何解决这个问题嘞?

对于第1个算术题,这是浮点运算精度的问题。
正确的比较方法是比较最小精度:

Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILOW

嗯,第一个问题解决了,那么第二个问题勒。

两个肉眼可见不同的数字,居然返回 true。

这不是睁眼说瞎话吗?

这个问题产生的原因是,数字太大,超出了 js 所能控制的范围 Number.MAX_SAFE_INTEGER。那我就是要比较要怎么搞嘞?

办法还是有的,就是使用 ES6 中的 BigInt 类型,来比较,简单来说,把 n 加到数字的后面。

99999999999999999999n === 100000000000000000000n
// false

嗯,这两道算术题真他喵的简单。

看样子,还是要抽空复习一下《计算机组成原理》的。

美好的周末又开始了。

pixiv | えすない | 78926471

图源

相关文章

  • JavaScript | 几道简单的算术题

    看几道小学算术题:[1]. 0.1 + 0.2 === 0.3[2]. 99999999999999999999 ...

  • 如何给净利润上妆

    前言:今天中午一兄弟后台给我留言,觉得昨天的文章《一起算几道小学算术题》太入门。道理虽然简单,但真正懂的有几个?不...

  • 那些弄不死你的,终究会让你更加强大

    在上一篇《年轻人,你为什么会焦虑》中,我们做了几道简单的算术题,但是结果让人比较沮丧。 也许有人不愿意承认,但是坦...

  • 能读小学,对丽梅来说很不容易,报名的时候老师让丽梅写一下自己的名字,丽梅歪歪曲曲的写了,问了几道简单的算术题,也勉...

  • 算术

    12月1日 星期六小雨 今天吃过晚饭后和女儿玩了一会,就给女儿出了几道算术题,开始做的时候她心不在焉所有总会错几道...

  • 心与心沟通

    简单的牵手, 标注:情愿+情愿=❤️ 沟通一道简单算术题:1❤️+1❤️=1❤️

  • 分享几道javaScript题

    1.已知字符串foo="get-element-by-id",写一个function将其转化成驼峰表示“getEl...

  • 七月七日晴?

    有这样一个超准的心理测试: 首先,做几道加法算术题: 2+2=? 4+4=? 8+8=? 16+16=? 然后在5...

  • 这是一个拼父母的时代

    女儿上幼儿园大班,前几天老师布置了几道10以内借位加减法算术题,在家长群里引起了不小的轰动。 左边的图片里是女儿幼...

  • 一起算几道小学算术题

    假如投资第一年赚40%,第二年亏20%,第三年赚40%,第四年亏20%,第五年赚40%,第六年亏20%。六年下来年...

网友评论

      本文标题:JavaScript | 几道简单的算术题

      本文链接:https://www.haomeiwen.com/subject/xrabrhtx.html