当前位置: 首页 > 后端技术 > Node.js

JavaScript舍入的那些坑

时间:2023-04-03 18:25:04 Node.js

前言经常用JavaScript处理数字的程序员都知道,JavaScript的Number.toFixed函数在格式化数字时会自动舍入,例如:10.125.toFixed(2)--->"10.13"但是在某些情况下,四舍五入的结果往往不尽如人意,例如:10.145.toFixed(2)--->"10.14"那么为什么会出现上述情况,我们需要从系统入手。众所周知,在计算机设计之初,出于各种不同的考虑,最终还是采用了二进制格式来存储数据。我们通常用于数字的基本系统是十进制。使用二进制格式存储十进制数据必然会面临基制的转换,而基制的转换又会面临精度的损失。例如,?对于三进制数是0.1,对于十进制数是0.333(3个周期)。三?的加法,对于三元系为一(每三进一),对于十进制为0.999(9圈)。同样的情况也会出现在十进制与二进制的转换中。当我们在计算机中声明一个变量为10.145时,这个数字实际上是以二进制形式存储在计算机中的,而不是真正的10.145。你可以通过Number.prototype.toPrecision方法找到。Number.prototype.toPrecision方法返回具有指定精度的此Number对象的字符串表示形式。10.145.toPrecision(21)--->"10.14499999999999995737"因此,它可以解释为什么在某些情况下toFixed()方法返回的舍入值不是预期的。同样,我也告诉大家,所有浮点数的计算,无一例外,加减乘除,在某些情况下,会出现意想不到的情况,最常见的比如0.1+0.2,等等。解决方案针对以上情况,我写了一个简单的库,可以满足数字的四舍五入需求。round-js探索浮点数的标准。与大多数语言不同,JavaScript目前对数字只有一种表示方式,即Number,它使用64位双精度浮点数来表示数字。该标准与大多数语言相同,使用IEEE-754标准。IEEE-754下的64位双精度浮点数的标准可以用一张图表示,如下:sign:表示一个符号,用1位表示,即一个正数和一个负数,1代表正数,0代表负数;exponent:表示指数,以2为底,用11位数字表示;fraction:实数有效数字,用52位数字表示。最后,对于这个标准,任何一个数,用下面的公式来表示:其中:V:结果S:以上符号M:有效数fractionE:以上指数可以看出,这种表示方法类似于小数的科学计数方法。对于这些概念,IEEE-754标准中还有很多规定,比如<1M<2等,更多的细节不再展开。超过。