JavaScript parseInt 处理浮点乘法时的精度丢失问题
作者:函数茶馆时间:2026-10-28 11:03:06浏览:392
本文分析 JavaScript 中 parseInt(1.13*100) 返回 112 的异常现象。该问题源于浮点数乘法运算的精度丢失,导致传入 parseInt 的值略小于 113。文章提供了通过增加小数位再除法的修正方案,并指出该 Bug 对涉及金额计算的业务逻辑具有潜在风险。
JavaScript parseInt 浮点精度异常分析
这是一个令人困惑的现象,今日在测试过程中偶然发现。执行 parseInt(1.13*100) 时,实际返回值为 112 而非预期的 113。具体代码实现如下所示。
代码如下:
<head>
<script type="text/javascript">
function test(){
var thisvalue = 0;
thisvalue=yuanToFen($("#inp").val());
alert(thisvalue);
}
/*元转分*/
function yuanToFen(yuan){
return parseInt(yuan*100,10);//解决方法:将 此处返回改为:parseInt(yuan*1000,10)/10;
}
</script>
</head>
<body>
<div>
<input type="text" id="inp" name="pl" value="1.14"/><!-- 当输入值是:1.13、1.14、1.15、1.16时,此bug才会出现,其他数据目前没有发现有此bug -->
<input type="button" name="ok" value="确认" onclick="test();"/>
</div>
</body>
</html> 运行上述代码后观察发现,当用户输入 1.13 至 1.16 之间的数值时,例如输入 1.13,弹窗显示的数值却是 1.12(即 112)。同理,若输入 1.16,弹窗显示为 1.15(即 115)。
然而,当输入 2.13、3.13 或 0.13 等数值时,并未出现此类异常。
此 Bug 对于涉及账务处理的业务场景尤为重要。
例如:在进行汇款操作时,若单位是亿元,输入 1.13 个亿,实际计算结果可能变为 1.12 个亿。这虽为玩笑说法,但程序开发必须严谨。无论是一分钱还是零点零一分,资金归属必须准确无误,绝不能马虎对待。
作者最新文章
Object.assign合并JS对象的用法与注意事项
2026-11-05 17:56:08
JS大数值转字符串出现科学计数法怎么办
2026-11-05 17:09:21
JS split切割后出现空字符串怎么过滤
2026-11-05 16:00:30
在 React 或 Vue 项目中封装使用 JS 节流防抖
2026-11-05 15:27:29
JavaScript中怎么将带小数的字符串转为整数?
2026-11-05 14:32:38
