Number.EPSILON很小的一个数,2的-52次方,或大约 2.2204460492503130808472633361816E-16
为什么0.1 + 0.2 不等于 0.3?
- 这涉及到 JavaScript 使用 IEEE 754 标准来表示浮点数,而在该标准下,某些十进制小数无法完全准确表示为二进制小数,导致精度问题。
- 可以把小数*10转化成整数或者,使用 Number.EPSILON 比较差值
说说 js 为什么会存在数字精度丢失的问题,以及如何进行解决
- js 中的数字类型在内存中是按照 IEEE 754 规范中双精度浮点数存储的(共 64 位),(单精度浮点数32位)
- IEEE 754 是《二进制浮点数规范》其中 IEEE 代表一个公司,754 是一个规范的编号 64 = 1位符号位(0 代表整数,1代表负数) + 11 位指数位(k+1) + 52 位小数位 其实是 53 位,科学计数法的第一位永远是 1,也就是有效数总是 1.xxx 的形式,所以忽略不存了)
- 任何数字都可以使用科学计数法表示,在存储数字时是按照以 2 为基数科学计数法存储的,一个数值使用科学计数法表示之后,后 52 位只存储科学计数法的小数部分。所以能够存储的数值在一定范围内,有些数字使用科学计数法表示小数部分超过 52 位,就会精度丢失
- 可以使用 BigInt 来解决大整数相加,或者手动实现一个大数相加的方法。
如何解决浮点数运算精度问题?
- 可以使用一些技巧,比如将浮点数转换为整数进行运算,然后再转换回浮点数。另外,可以使用库如 BigNumber.js 或者使用 ECMAScript 新引入的 Number.EPSILON 进行比较。
- 使用 toFixed(小数位数) 、toPrecision(整数+小数的总共的位数)
如何在 JavaScript 中判断一个数字是整数?
- 可以使用 Number.isInteger() 方法,例如 Number.isInteger(5) 会返回 true,而 Number.isInteger(5.5) 会返回 false。
如何比较两个浮点数是否相等?
- 由于浮点数精度的问题,直接使用 == 或 === 可能会导致错误的比较结果。推荐使用 Math.abs(a - b) < Number.EPSILON 这种方式来比较浮点数的相等性。希腊字母