前端JS计算精度损失的问题

前言

JS的计算是会损失精度的,比如

1
2
3
4
0.1+0.2 //0.30000000000000004
1.2-1 //0.19999999999999996
1.15*100 //114.99999999999999
1.2/0.2 //5.999999999999999

方式1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// 两个浮点数求和
function num_add(num1,num2){
var r1,r2,m;
try{
r1 = num1.toString().split('.')[1].length;
}catch(e){
r1 = 0;
}
try{
r2=num2.toString().split(".")[1].length;
}catch(e){
r2=0;
}
m=Math.pow(10,Math.max(r1,r2));
return Math.round(num1*m+num2*m)/m;
}

// 两个浮点数相减
function num_subtract(num1,num2){
var r1,r2,m;
try{
r1 = num1.toString().split('.')[1].length;
}catch(e){
r1 = 0;
}
try{
r2=num2.toString().split(".")[1].length;
}catch(e){
r2=0;
}
m=Math.pow(10,Math.max(r1,r2));
n=(r1>=r2)?r1:r2;
return Number((Math.round(num1*m-num2*m)/m).toFixed(n));
}

// 两个浮点数相乘
function num_multiply(num1,num2){
var m=0,s1=num1.toString(),s2=num2.toString();
try{m+=s1.split(".")[1].length}catch(e){};
try{m+=s2.split(".")[1].length}catch(e){};
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);
}

// 两个浮点数相除
function num_divide(num1,num2){
var t1,t2,r1,r2;
try{
t1 = num1.toString().split('.')[1].length;
}catch(e){
t1 = 0;
}
try{
t2=num2.toString().split(".")[1].length;
}catch(e){
t2=0;
}
r1=Number(num1.toString().replace(".",""));
r2=Number(num2.toString().replace(".",""));
return (r1/r2)*Math.pow(10,t2-t1);
}

调用

1
2
3
4
num_add(0.1, 0.2);
num_subtract(1.2,1);
num_multiply(1.15, 100);
num_divide(1.2,0.2);

方式2-Math.js

JS地址

https://cdnjs.cloudflare.com/ajax/libs/mathjs/5.0.0/math.min.js

页面引用

1
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/5.0.0/math.min.js"></script>

方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 加
function num_add(num1, num2) {
return Number(math.add(math.bignumber(num1), math.bignumber(num2)));
}

// 减
function num_subtract(num1, num2) {
return Number(math.subtract(math.bignumber(num1), math.bignumber(num2)));
}

// 乘
function num_multiply(num1, num2) {
return Number(math.multiply(math.bignumber(num1), math.bignumber(num2)));
}

// 除
function num_divide(num1, num2) {
return Number(math.divide(math.bignumber(num1), math.bignumber(num2)));
}

调用

1
2
3
4
num_add(0.1, 0.2);
num_subtract(1.2,1);
num_multiply(1.15, 100);
num_divide(1.2,0.2);