parseInt函数踩坑

一、遇到的问题

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
// 象棋中结算积分的函数
function calculate(selfsocores, othersocores, result, color, mult) {
let finalsocores; //最终积分
let factor; //因子
let expect; //期望
let gap; //积分差
let variable;
switch (color) {
case PLAY_COLOR.RED:
variable = -100;
break; // 红方
case PLAY_COLOR.BLACK:
variable = 100;
break; // 黑方
default:
variable = 0;
break;
}
if (selfsocores < 1000) {
factor = 120;
} else if (selfsocores < 1400) {
factor = 60;
} else if (selfsocores < 1800) {
factor = 30;
} else if (selfsocores < 2000) {
factor = 25;
} else if (selfsocores < 2200) {
factor = 20;
} else if (selfsocores < 2400) {
factor = 15;
} else {
factor = 10;
}
gap = ((othersocores - selfsocores) + variable) / 400;
expect = 1 / (Math.pow(10, gap) + 1);
console.log("factor:", factor, "variable:", variable, "expect:", expect, "gap:", gap, factor * (result - expect));
finalsocores = Math.floor(selfsocores + mult * parseInt(factor * (result - expect)));
return finalsocores;
}

1
2
3
4
5
6
7
输入为: selfsocores = 5083, othersocores = 1818, result = 1, color = 1, mult = 1;
输出为:factor: 10 variable: 100 expect: 0.999999987767929 gap: -7.9125 1.223207102274415e-7
1
5084

其中 factor * (result - expect) 的值为 1.223207102274415e-7,远小于1,但 parseInt(factor * (result - expect)) 却得到结果1

二、科学计数法

JavaScript中对于极大或者极小的数,可以用科学计数法e来表示的浮点数值来表示。科学计数法允许字母e 或 E 的后面,跟着一个整数,表示这个数值的指数部分。

以下两种情况,JavaScript 会自动将数值转为科学计数法表示

1
2
3
4
5
6
7
8
9
10
11
(1) 小于1且小数点后面带有6个0以上的浮点数值:
JavaScript 代码:
0.0000003 // 3e-7
0.00000033 // 3.3e-7
0.000003 // 0.000003

(2) 整数位数字多于21位:
JavaScript 代码:
1234567890123456789012 //1.2345678901234568e+21
1234567890123456789012.1 //1.2345678901234568e+21
123456789012345678901 //123456789012345680000

三、parseInt函数

1
2
3
4
5
语法:parseInt(string [ , radix])

string 要被解析的值。如果参数不是一个字符串,则将其转换为字符串(使用ToString 抽象操作)。字符串开头的空白符将会被忽略

radix 从2到36,表示字符串的基数。请注意,10不是默认值!

由于某些数字在其字符串表示形式中使用e字符(例如 6.022×23 表示 6.022e23 ),因此当对非常大或非常小的数字使用数字时,使用 parseInt 截断数字将产生意外结果。

1
2
console.log(parseInt(0.0000015));   // print 0
console.log(parseInt(0.00000015)); // print 1

官方定义: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/parseInt