Math.floor()与parseInt()都是JavaScript中用于处理整数的函数,它们都只保留整数部分。然而,在使用这两个函数进行转换时,可能会出现不精确的情况。
在转换过程中,有一个临界点需要特别注意:当数值具有16位小数,且最后一位小数为5时,使用Math.floor()或parseInt()得到的结果可能是该数值的最大整数。例如:
```javascript
Math.floor(5.9999999999999995); // 结果是5
Math.floor(5.9999999999999996); // 结果是6
```
此外,还有一个问题是浮点数计算精度问题。例如,当我们计算1.01 + 1.1时,结果并不是2.11。为了解决这个问题,我们可以使用toFixed()方法将计算结果四舍五入并设置保留的小数位数。toFixed()返回的是字符串类型,如果需要将其转换为数字类型,可以使用parseFloat()函数。
另外,在处理正整数向下取值和负整数向上取值时,可以使用位运算来替换Math.floor()和Math.ceil()函数。具体实现方式如下:
```javascript
// 只对正整数进行向下取值
const num = -5;
const result = (num >> 0) << 0;
console.log(result); // 输出:-5
// 只对负整数进行向上取值
const num = -3;
const result = (num >> 0) << 0;
console.log(result); // 输出:-2
```
需要注意的是,JavaScript中的number类型有一个最大值(安全值)。这个值是2的53次方,约为9007199254740992(16位)。如果超过这个值,JavaScript就会出现不精确的问题。通常情况下,我们的主键会使用雪花算法设置成长整型。但当过长的长整型传到前端后,可能会丢失精度。为了解决这个问题,可以在传递给前端时将Long类型转换为String类型。