Mayanming

One day mayanming will be somebody

记录某次真实项目需要计算高精度浮点数,原生JS进行高浮点数计算出现偏差大。

项目背景

在JS中,整数的运算基本简单可以保证精确;但是小数的运算,可能会得到一个不精确的结果。所以,千万不要使用JS进行对精确度要求比较高的运算。

例如最简单的测试例子:

    var textNumber = 0.1 + 0.2;
    console.log(textNumber);  //打印结果:0.30000000000000004

具体根本原因:计算机在做运算时,所有的运算都要转换成二进制去计算。然而,有些数字转换成二进制之后,无法精确表示,因此存在浮点数的计算不精确的问题。

JS处理精度数字运算方法

1.JS处理精度浮点数运算方法

如果需要的计算结果不需要特别高精度可以 toFix() 对浮点数进行截取。在进行计算。

2.JS处理精度浮点数运算方法

在实际中,浮点数计算精确度复杂,因此对数学运算精确度使用开源库,例如:decimal.js ,math.js。这些都是开源并且比较成熟,直接使用。

  • Math.js:属于很全面的运算库,文件很大,压缩后的文件就有500kb。如果你的项目涉及到大型的复杂运算,可以使用 Math.js。
  • decimal.js:属于轻量的运算库,压缩后的文件只有32kb。大多数项目的数学运算,使用 decimal.js 足够了。

在使用这两个个开源库时,既可以用 cdn 的方式引入,也可以用 npm 包的方式引入。

decimal.js语法例子

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
    </head>
    <body>
        <script src="https://cdn.bootcdn.net/ajax/libs/decimal.js/10.2.0/decimal.min.js"></script>
        <script>
            console.log('加法:');
            var a = 0.1;
            var b = 0.2;
            console.log(a + b);
            console.log(new Decimal(a).add(new Decimal(b)).toNumber());

            console.log('减法:');
            var a = 1.0;
            var b = 0.7;
            console.log(a - b);
            console.log(new Decimal(a).sub(new Decimal(b)).toNumber());

            console.log('乘法:');
            var a = 1.01;
            var b = 1.003;
            console.log(a * b);
            console.log(new Decimal(a).mul(new Decimal(b)).toNumber());

            console.log('除法:');
            var a = 0.029;
            var b = 10;
            console.log(a / b);
            console.log(new Decimal(a).div(new Decimal(b)).toNumber());
        </script>
    </body>
</html>

math.js语法例子

math.add( ) 加

math.subtract( )减
math.divide( ) 除

math.multiply( )乘

评论