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(#指任何数字)
我很困惑任何人都可以帮助我。
提前致谢。
答案 0 :(得分:5)
Javascript使用数字的二进制浮点表示(IEEE754)。
使用此表示形式,唯一可以精确表示的数字是n / 2 m 形式,其中n
和m
都是整数。
任何不合理的数字,其中分母是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));