首页 > 常识 >

保留有效数字的规则(javascript如何实现四舍五入?)

100次浏览     发布时间:2024-10-10 08:06:42    

在统计、经济或金融业务相关的软件开发过程中,都有数值计算的需求,这就涉及到精确度的问题,这里说明两种处理规则。

四舍五入规则

数学上的四舍五入,这是在进行数值运算时,能够保留精确度的一种计数方法。主要针对浮点运算,对整数运算同样适用。舍弃位如果小于5,则直接丢弃,如果是大于等于5,则丢弃后进一位。举例:3.1425,要保留3位小数。保留位数值是2,舍弃位数值,即小数第4位是5,根据四舍五入法则,丢弃并进一位,得到3.143。

银行家舍入法,如果舍弃位小于5直接丢弃,大于5则丢弃后进一位;如果是5,分两种情况,如果是丢弃位后面还有非0数值(有多位以0开始,也属于这种情况,如3.1425035,第4位是丢弃位,后面有数值035),则丢弃后进一位,如果丢弃位后面没有非0数值(有多位0也属于这种情况,如3.1425000,第4位是丢弃位,后面有数值000),则前一位保留位是偶数,则舍弃位直接丢弃不进位,如果是奇数则丢弃后进一位。

javascript实现

函数Math.round,是把数值舍入为最近的整数,通过乘10的倍数,再除以10的倍数,可以间接实现四舍五入保留指定小数位数的逻辑。

函数Number.toFixed,是可以按四舍五入指定数值小数部分的保留位数。

但是由于计算机系统内部处理数据用的是二进制,而我们通常输入的都是十进制数据,再进行转换时,会有数值精度丢失的问题,尤其是在处理小数时,比如输入3.1415926,计算机系统内部将该十进制转换成二进制存储,再计算处理结束后,又返回十进制表示时,可能是3.14159259999999999999。这里只是说明这种关系,实际返回不一定是这个结果。

保留两位小数的数值比较

图中标红的数值是与实际进位不符的,不同的数值以及保留位数的不同,得到的结果也各不相同,没有规律。但是我们也看到Number.toPrecision这个函数,它的舍入结果是符合数学上的四舍五入规则的。

函数Number.toPrecision,是按数学上的四舍五入规则,保留指定位数的有效数字,不是保留指定位数的小数。有效数字指从第一个数字不是0的数字开始计数。如0.002346,保留3位有效数字,并不是0.002,而是0.00235(4的后面是5,按四舍五入进一位变成5)。在实际开发中,可以利用这个函数,实现按数学上的四舍五入保留小数位数的函数。

有名人曾经说过,要想记的牢,就要自己动手做。

相关文章