JavaScript parseInt 处理浮点乘法时的精度丢失问题

作者:函数茶馆

时间:2026-10-28

浏览:391

本文分析 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 个亿。这虽为玩笑说法,但程序开发必须严谨。无论是一分钱还是零点零一分,资金归属必须准确无误,绝不能马虎对待。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章