javascript 的带小数的加法会有误差

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
function plus(a, b) {
// 数字转字符
a = String(a);
b = String(b);
// 按 . 分割成数组
var arr = a.split('.');
var brr = b.split('.');
// 整数部分正常相加
var rezheng = Number(arr[0]) + Number(brr[0]);
// 取小数部分
var ax = arr.length == 1 ? '0' : arr[1];
var bx = brr.length == 1 ? '0' : brr[1];
// 较短的小数位数后面+0,变成相同位数
// 如 5 +12 => 50+12 (相当于0.50+0.12)
var axl = ax.length,
bxl = bx.length;
var a_b_l = axl - bxl;
var maxl = axl;
if (a_b_l > 0) {
for (var i = 0; i < a_b_l; i++) {
bx += '0';
}
}
if (a_b_l < 0) {
maxl = bxl;
a_b_l = a_b_l * -1;
for (var i = 0; i < a_b_l; i++) {
ax += '0';
}
}
//小数部分相加
var rexiao = Number(ax) + Number(bx);
// 如果小数相加进位了,加到整数上
// 如 9+8 =17 ; 0.9+0.8 => 1.7
if (String(rexiao).length > maxl) {
rexiao = String(rexiao).slice(maxl * -1);
rezheng = rezheng + 1;
}
// 用小数点连接整数和小数,并返回
return Number(rezheng + '.' + rexiao);
}

编辑文章✏