我正在尝试将数字保留两位小数,为此我使用了JavaScript的toFixed
函数。以下是我得到的奇怪结果,请检查并帮助我。
var number = 11.995; number.toFixed(2); // 得到正确的结果:11.99 var number = 19.995; number.toFixed(2); // 得到错误的结果:20.00
请问有人能告诉我为什么会发生这种情况吗?
感谢您的帮助。
我正在尝试将数字保留两位小数,为此我使用了JavaScript的toFixed
函数。以下是我得到的奇怪结果,请检查并帮助我。
var number = 11.995; number.toFixed(2); // 得到正确的结果:11.99 var number = 19.995; number.toFixed(2); // 得到错误的结果:20.00
请问有人能告诉我为什么会发生这种情况吗?
感谢您的帮助。
要获得更深入的解释,请阅读这个链接: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
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);
toFixed
不会这样做 - 我们怎么知道可能会有问题呢?嗯,我想我们应该意识到这点... - iAmOrentoFixed
将值四舍五入。由于19.995恰好处于19.99和20.00的中间,因此必须选择其中一个。传统上,四舍五入会优先选择偶数结果(这可以防止偏差,因为四舍五入的结果和舍去的结果将相等)。
19.999991 + 0.000004
相加来测试这一点,结果为19.999995000000002
。 - David Hellsing0.5.toFixed(0)
等于1,1.5.toFixed(0)
等于2。 - Barmar(11.995).toFixed(2)
是11.99。 - David Hellsing我猜David已经回答了你的疑问。这里提供另一种解决方案。
你可以使用Math对象的Math.floor()
方法来实现。
像这样:Math.floor(number*100)/100
这就解释了为什么使用通常的四舍五入操作时,11.995
(实际上是11.99499988555908203125
)向下舍入到11.99
,但19.995
(实际上是19.9950008392333984375
)向上舍入到20.00
。
(此网站有一个方便的计算器来可视化这些内容。)
在SO上还有更多信息:
indexOf
来检测点,或者只需使用一个正则表达式:/-?\d+(\.\d{0,2})?/
。注意:该正则表达式不完整,它不能处理指数。 - Rob W