关于JavaScript中的toFixed精度问题

时间:2022-09-27 14:51:34
在做财务系统的时候碰到了这个问题.
由于页面中的一些数据可能动态改变,然后我需要根据设置的精度位数来实现金额的四舍五入精度化
测试过以后 发现toFixed 有问题 好像不是在四舍五入.
还要考虑浏览器兼容性 不知道大家是怎么解决的?
也不知道当初JavaScript为什么这么设计?

11 个解决方案

#1


var num = 1.25678998;

Math.round(num*100)/100;
Math.ceil(num*100)/100

#2


引用 1 楼 KK3K2005 的回复:
var num = 1.25678998;

Math.round(num*100)/100;
Math.ceil(num*100)/100


前辈 比如 我有一个设置 设置某个金额值需要2位精度 那么我的这个变量2  该从那里处理??
tofied不行了?

#3


我不是写了
你的数字乘100 再取整 然后除100

Math.round(num*100)/100;

#4


toFixed在各浏览器下表现不一  
(8.985).toFixed(2)

各浏览器弹出结果:
ie7 : 8.99
ie8 : 8.99
ie9+ : 8.98
FF : 8.98
chrome : 8.98

产生这果种结的原因:浏览器js库也存在差异,所以表现也不同。

解决办法:
var num = 8.985;
alert((num+0.005).toFixed(2));

#5


解决办法:
var num = 8.985;
alert((num+((0.5).toFixed(0)==1?0.005:0)).toFixed(2));

#6


不对,不对
toFixed 的问题还不少,单用toFixed还不好解决,郁闷了 关于JavaScript中的toFixed精度问题

#7


引用 3 楼 KK3K2005 的回复:
我不是写了
你的数字乘100 再取整 然后除100

Math.round(num*100)/100;


不是 你没有明白我的意思  你这个只是计算了金额值   如果我要保留的小叔位数是动态设置呢?

#8


引用 6 楼 jslang 的回复:
不对,不对
toFixed 的问题还不少,单用toFixed还不好解决,郁闷了 关于JavaScript中的toFixed精度问题

是唉 这个问题比较郁闷

#9


引用 楼主 SomethingJack 的回复:
在做财务系统的时候碰到了这个问题.
由于页面中的一些数据可能动态改变,然后我需要根据设置的精度位数来实现金额的四舍五入精度化
测试过以后 发现toFixed 有问题 好像不是在四舍五入.
还要考虑浏览器兼容性 不知道大家是怎么解决的?
也不知道当初JavaScript为什么这么设计?
<html>
<head>
<title>四舍五入</title>
</head>
<body>
<input type='text' id='input_val' style="width:100px; height:20px;"/>
<button id='input_handle'>Click</button>
        <div id='value'></div>
</body>
<script type="text/javascript">
        function $(id){
         return document.getElementById(id);
        }

        $('input_handle').onclick = function inputHandle(){
         // 作为可设定的值  在此处获取替换掉2
var len =2;

         var val = $('input_val').value;
         var tempval = val.substring(0,val.indexOf('.') + len + 2);
var value = Math.pow(10,len)
alert(Math.round(tempval * value)/value);
        }
</script>
</html>

#10


Math.toFixed(保留小数位数)。

用保留小数位数后的一个小数来确定是四舍还是五入。

本人单独测试toFixed时四舍五入是没有问题的。不信楼主也自己试一下。

#11


引用 10 楼 u010203057 的回复:
Math.toFixed(保留小数位数)。

用保留小数位数后的一个小数来确定是四舍还是五入。

本人单独测试toFixed时四舍五入是没有问题的。不信楼主也自己试一下。

不是每个都有问题的,你可以试试0.955

#1


var num = 1.25678998;

Math.round(num*100)/100;
Math.ceil(num*100)/100

#2


引用 1 楼 KK3K2005 的回复:
var num = 1.25678998;

Math.round(num*100)/100;
Math.ceil(num*100)/100


前辈 比如 我有一个设置 设置某个金额值需要2位精度 那么我的这个变量2  该从那里处理??
tofied不行了?

#3


我不是写了
你的数字乘100 再取整 然后除100

Math.round(num*100)/100;

#4


toFixed在各浏览器下表现不一  
(8.985).toFixed(2)

各浏览器弹出结果:
ie7 : 8.99
ie8 : 8.99
ie9+ : 8.98
FF : 8.98
chrome : 8.98

产生这果种结的原因:浏览器js库也存在差异,所以表现也不同。

解决办法:
var num = 8.985;
alert((num+0.005).toFixed(2));

#5


解决办法:
var num = 8.985;
alert((num+((0.5).toFixed(0)==1?0.005:0)).toFixed(2));

#6


不对,不对
toFixed 的问题还不少,单用toFixed还不好解决,郁闷了 关于JavaScript中的toFixed精度问题

#7


引用 3 楼 KK3K2005 的回复:
我不是写了
你的数字乘100 再取整 然后除100

Math.round(num*100)/100;


不是 你没有明白我的意思  你这个只是计算了金额值   如果我要保留的小叔位数是动态设置呢?

#8


引用 6 楼 jslang 的回复:
不对,不对
toFixed 的问题还不少,单用toFixed还不好解决,郁闷了 关于JavaScript中的toFixed精度问题

是唉 这个问题比较郁闷

#9


引用 楼主 SomethingJack 的回复:
在做财务系统的时候碰到了这个问题.
由于页面中的一些数据可能动态改变,然后我需要根据设置的精度位数来实现金额的四舍五入精度化
测试过以后 发现toFixed 有问题 好像不是在四舍五入.
还要考虑浏览器兼容性 不知道大家是怎么解决的?
也不知道当初JavaScript为什么这么设计?
<html>
<head>
<title>四舍五入</title>
</head>
<body>
<input type='text' id='input_val' style="width:100px; height:20px;"/>
<button id='input_handle'>Click</button>
        <div id='value'></div>
</body>
<script type="text/javascript">
        function $(id){
         return document.getElementById(id);
        }

        $('input_handle').onclick = function inputHandle(){
         // 作为可设定的值  在此处获取替换掉2
var len =2;

         var val = $('input_val').value;
         var tempval = val.substring(0,val.indexOf('.') + len + 2);
var value = Math.pow(10,len)
alert(Math.round(tempval * value)/value);
        }
</script>
</html>

#10


Math.toFixed(保留小数位数)。

用保留小数位数后的一个小数来确定是四舍还是五入。

本人单独测试toFixed时四舍五入是没有问题的。不信楼主也自己试一下。

#11


引用 10 楼 u010203057 的回复:
Math.toFixed(保留小数位数)。

用保留小数位数后的一个小数来确定是四舍还是五入。

本人单独测试toFixed时四舍五入是没有问题的。不信楼主也自己试一下。

不是每个都有问题的,你可以试试0.955