我正在尝试将数字修复为小数点后的 2 位数字,为此我正在使用toFixed
javascript 函数。以下是我得到的奇怪结果,请检查并帮助我。
无功编号 = 11.995; number.toFixed(2); //给我 11.99 这是正确的 无功编号 = 19.995; number.toFixed(2); //给我 20.00 这是不正确的
谁能告诉我为什么会这样。
谢谢你的帮助。
我正在尝试将数字修复为小数点后的 2 位数字,为此我正在使用toFixed
javascript 函数。以下是我得到的奇怪结果,请检查并帮助我。
无功编号 = 11.995; number.toFixed(2); //给我 11.99 这是正确的 无功编号 = 19.995; number.toFixed(2); //给我 20.00 这是不正确的
谁能告诉我为什么会这样。
谢谢你的帮助。
这就是浮点数学的工作原理。值 19.995 不是精确的二进制(基数为 2)。为了更清楚,当你除以 10/3 时,请考虑一个确切的数字。
有关更深入的解释,请阅读:http : //docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
在您的情况下,您可以使用字符串来代替(至少看起来这是您想要的):
number.toString().substr(0, n);
或者定义一个这样的函数(2分钟完成,只是一个例子):
Number.toFixed = function(no, n) {
var spl = no.toString().split('.');
if ( spl.length > 1 ) {
return spl[0]+'.'+spl[1].substr(0,n);
}
return spl[0];
}
Number.toFixed(19.995, 2); // 19.99
toFixed
舍入该值。由于 19.995 正好介于 19.99 和 20.00 之间,因此它必须选择其中之一。传统上,舍入更喜欢偶数结果(这可以防止偏差,因为向上舍入和向下舍入将相等)。
我创建了一个功能,它为我完成了所有工作..
function toFixed(number, precision) {
var multiplier = Math.pow(10, precision + 1),
wholeNumber = Math.floor(number * multiplier);
return Math.round(wholeNumber / 10) * 10 / multiplier;
}
//Call this function to retrive exect value
toFixed((+adjustmentval), 2);
我猜大卫已经回答了你的疑问。只是在这里提供一个替代解决方案。
您可以Math.floor()
为此使用Math 对象的方法。
像这样的东西, Math.floor(number*100)/100