toFixed功能不正常(请给出一个不能替代的理由)

时间:2015-03-12 11:05:24

标签: javascript math

toFixed()函数对浮点值的响应不同。 例如:

 var a = 2.555;
 var b = 5.555;

console.log(a.toFixed(2));  /* output is 2.56 */ 
console.log(b.toFixed(2));  /* output is 5.55 */

对于2.555 / 3.555,结果是(2.56 / 3.56)

对于其他值(不确定所有值),它显示#.55(#指任何数字)

我很困惑任何人都可以帮助我。

提前致谢。

3 个答案:

答案 0 :(得分:5)

Javascript使用数字的二进制浮点表示(IEEE754)。 使用此表示形式,唯一可以精确表示的数字是n / 2 m 形式,其中nm都是整数。

任何不合理的数字,其中分母是2的整数幂是不可能完全表示的,因为在二进制中它是一个周期数(它在点之后有无限的二进制数字)。

数字0.5(即1/2)很好,(二进制只是0.1₂)但是例如0.55(即11/20)无法准确表示(在二进制它是0.100011001100110011₂…,即0.10(0011)₂,最后一部分0011₂重复无限次)。

如果您需要进行任何结果取决于精确十进制数的计算,则需要使用精确的十进制表示。如果小数位数是固定的(例如3),则一个简单的解决方案是将所有值保持为整数乘以1000 ...

2.555 --> 2555
5.555 --> 5555
3.7   --> 3700

并相应地进行乘法和除法时调整计算(例如,在将两个数相乘后,需要将结果除以1000)。

IEEE754双精度格式准确,整数高达9,007,199,254,740,992,这对于价格/价值来说通常已经足够了(四舍五入是最常见的问题)。

答案 1 :(得分:2)

试试这个Demo Here

function roundToTwo(num) {    
    alert(+(Math.round(num + "e+2")  + "e-2"));
}

roundToTwo(2.555);
roundToTwo(5.555);

答案 2 :(得分:0)

toFixed()方法取决于浏览器向下舍入或保留。

以下是此问题的解决方案,最后检查“5”

 var num = 5.555;
 var temp = num.toString();
if(temp .charAt(temp .length-1)==="5"){
temp = temp .slice(0,temp .length-1) + '6';
}
num = Number(temp);
Final = num.toFixed(2);

或可重复使用的功能就像

function toFixedCustom(num,upto){

     var temp = num.toString();
    if(temp .charAt(temp .length-1)==="5"){
    temp = temp .slice(0,temp .length-1) + '6';
    }
    num = Number(temp);
    Final = num.toFixed(upto);
    return Final;
}

var a = 2.555;
 var b = 5.555;

console.log(toFixedCustom(a,2));  
console.log(toFixedCustom(b,2));