如何用位运算替代%1与Math.round优化JS浮点数转换函数?
位运算替代方案
1. 替换number % 1 == 0整数判断
JS 中所有位运算都会先将操作数强制转换为32位有符号整数,自动丢弃小数部分,所以只要判断「位运算取整后的结果」和「原数」是否相等即可,正确写法:
if ((number | 0) === number)
注意:该判断仅对范围在
-2^31 ~ 2^31-1之间的数有效,如果你的业务场景中会出现超过这个范围的整数,可以保留原%1的写法,实际性能差异极小。
2. 替换Math.round(number)四舍五入
Math.round的核心逻辑是:正数加0.5后向下取整,负数减0.5后向下取整。用位运算实现的写法如下:
- 仅处理正数(适配你当前的业务场景):
(number + 0.5) | 0
- 兼容正负数的通用写法:
number + (number > 0 ? 0.5 : -0.5) | 0
优化后的完整代码
建议同时把递归改成迭代,避免递归调用的栈开销,性能提升更明显:
function get_whole_number(number, exponent = 0) { while(exponent < 500) { if ((number | 0) === number) break; exponent++; number *= 2; } return [(number + 0.5) | 0, exponent]; } console.log( get_whole_number(1.125).join("/2^"));
内容的提问来源于stack exchange,提问作者Krokodil
相关产品推荐
相关产品推荐

