我正在尝试将数字修改为小数点后的2位数,并且我正在使用javascript的toFixed
函数。以下是我得到的奇怪结果,请检查并帮助我。
var number = 11.995; number.toFixed(2); // giving me 11.99 which is correct var number = 19.995; number.toFixed(2); // giving me 20.00 which is incorrect
任何人都可以告诉我它为什么会发生。
感谢您的帮助。
答案 0 :(得分:1)
这就是浮点数学的工作原理。值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
答案 1 :(得分:0)
大卫已经回答了你的猜疑我猜。只是在这里提供替代解决方案。
您可以使用Math对象的Math.floor()
方法。
像这样,Math.floor(number*100)/100
答案 2 :(得分:0)
toFixed
对值进行舍入。由于19.995正好在19.99和20.00之间,它必须选择其中之一。传统上,舍入更喜欢均匀结果(这可以防止偏差,因为舍入和舍入将相等)。
答案 3 :(得分:0)
我已经创建了一个为我完成所有功能的功能..
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);