Dogbert 的回答很好,但如果您的代码可能不得不处理负数,Math.floor
本身可能会产生意想不到的结果。
例如Math.floor(4.3) = 4
,但是Math.floor(-4.3) = -5
使用类似这样的辅助函数来获得一致的结果:
truncateDecimals = function (number) {
return Math[number < 0 ? 'ceil' : 'floor'](number);
};
// Applied to Dogbert's answer:
var a = 5.467;
var truncated = truncateDecimals(a * 100) / 100; // = 5.46
这里是这个函数的一个更方便的版本:
truncateDecimals = function (number, digits) {
var multiplier = Math.pow(10, digits),
adjustedNum = number * multiplier,
truncatedNum = Math[adjustedNum < 0 ? 'ceil' : 'floor'](adjustedNum);
return truncatedNum / multiplier;
};
// Usage:
var a = 5.467;
var truncated = truncateDecimals(a, 2); // = 5.46
// Negative digits:
var b = 4235.24;
var truncated = truncateDecimals(b, -2); // = 4200
如果这不是所需的行为,请在第一行插入对 Math.abs
的调用:
var multiplier = Math.pow(10, Math.abs(digits)),
编辑: shendz 正确地指出,将这个解决方案与a = 17.56
一起使用会错误地产生17.55
。有关为什么会发生这种情况的更多信息,请阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic。不幸的是,使用 javascript 编写一个消除所有浮点错误来源的解决方案非常棘手。在另一种语言中,您会使用整数或 Decimal 类型,但使用 javascript...
这个解决方案应该是 100% 准确的,但它也会更慢:
function truncateDecimals (num, digits) {
var numS = num.toString(),
decPos = numS.indexOf('.'),
substrLength = decPos == -1 ? numS.length : 1 + decPos + digits,
trimmedResult = numS.substr(0, substrLength),
finalResult = isNaN(trimmedResult) ? 0 : trimmedResult;
return parseFloat(finalResult);
}
对于那些需要速度但又想避免浮点错误的人,可以试试BigDecimal.js。您可以在这个 SO 问题中找到其他 javascript BigDecimal 库:"Is there a good Javascript BigDecimal library?",这是一篇关于 math libraries for Javascript 的好博文