2019-01-17 回答 他的计算结果为 false,因为 JavaScript 中的 Math 遵循 IEEE 754 标准使用了 64 位的浮点数。简言之:计算机使用二进制来存储小数,而大部分小数转换成二进制后都是无限循环的值,因此需要进行取舍,这样一来在进行十进制计算时就会导致精度丢失。 0.1 + 0.2 / ..

`0.1 + 0.2 === 0.3` 的计算结果是什么?

本贴最后更新于 274 天前,其中的信息可能已经事过境迁

2019-01-17

回答

他的计算结果为 false,因为 JavaScript 中的 Math 遵循 IEEE 754 标准使用了 64 位的浮点数。简言之:计算机使用二进制来存储小数,而大部分小数转换成二进制后都是无限循环的值,因此需要进行取舍,这样一来在进行十进制计算时就会导致精度丢失。

0.1 + 0.2 // 0.30000000000000004

要解决精度问题,可以通过以下函数对误差进行忽略:

const approxEqual = (n1, n2, epsilon = 0.0001) => Math.abs(n1 - n2) < epsilon
approxEqual(0.1 + 0.2, 0.3) // true 

加分回答

const add = (num1, num2) => {
    const num1Digits = (num1.toString().split('.')[1] || '').length;
    const num2Digits = (num2.toString().split('.')[1] || '').length;
    const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));
    return (num1 * baseNum + num2 * baseNum) / baseNum;
}

返回总目录

每天 30 秒

  • 30Seconds

    精选的常见前端问题集,帮助您踏踏实实走好每一步。

    英文原文请看 30-seconds

    291 引用 • 290 回帖 • 6 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    432 引用 • 1025 回帖 • 864 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    227 引用 • 1247 回帖 • 310 关注
回帖
请输入回帖内容...