我有以下 JavaScript 语法:
var discount = Math.round(100 - (price / listprice) * 100);
这四舍五入到整数。如何返回带有两位小数的结果?
我有以下 JavaScript 语法:
var discount = Math.round(100 - (price / listprice) * 100);
这四舍五入到整数。如何返回带有两位小数的结果?
注意 - 如果 3 位精度很重要,请参阅编辑 4
var discount = (price / listprice).toFixed(2);
toFixed 将根据超过 2 位小数的值为您四舍五入。
示例:http : //jsfiddle.net/calder12/tv9HY/
文档:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed
编辑- 正如其他人所提到的,这会将结果转换为字符串。为避免这种情况:
var discount = +((price / listprice).toFixed(2));
编辑 2 - 正如评论中所提到的,该函数在某些精度上失败,例如在 1.005 的情况下,它将返回 1.00 而不是 1.01。如果这种程度的准确性很重要,我找到了这个答案:https : //stackoverflow.com/a/32605063/1726511这似乎适用于我尝试过的所有测试。
但是,需要进行一个小的修改,上面链接的答案中的函数在舍入为 1 时返回整数,因此例如 99.004 将返回 99 而不是 99.00,这不适合显示价格。
编辑 3 - 似乎在实际返回时使用 toFixed 仍然搞砸了一些数字,这个最终编辑似乎有效。天啊这么多返工!
var discount = roundTo((price / listprice), 2);
function roundTo(n, digits) {
if (digits === undefined) {
digits = 0;
}
var multiplicator = Math.pow(10, digits);
n = parseFloat((n * multiplicator).toFixed(11));
var test =(Math.round(n) / multiplicator);
return +(test.toFixed(digits));
}
请参阅此处的小提琴示例:https : //jsfiddle.net/calder12/3Lbhfy5s/
编辑 4 - 你们杀了我。Edit 3 在负数上失败,没有深入研究为什么在进行舍入之前将负数变为正数,然后在返回结果之前将其转回更容易处理。
function roundTo(n, digits) {
var negative = false;
if (digits === undefined) {
digits = 0;
}
if (n < 0) {
negative = true;
n = n * -1;
}
var multiplicator = Math.pow(10, digits);
n = parseFloat((n * multiplicator).toFixed(11));
n = (Math.round(n) / multiplicator).toFixed(digits);
if (negative) {
n = (n * -1).toFixed(digits);
}
return n;
}
如果您使用一元加号将字符串转换为 MDN 上记录的数字。
例如:+discount.toFixed(2)
函数 Math.round() 和 .toFixed() 旨在四舍五入到最接近的整数。在处理小数和使用 Math.round() 的“乘除”方法或 .toFixed() 的参数时,您会得到不正确的结果。例如,如果您尝试使用 Math.round(1.005 * 100) / 100 对 1.005 进行四舍五入,那么您将获得 1 的结果,使用 .toFixed(2) 获得 1.00 的结果,而不是获得 1.01 的正确答案。
您可以使用以下方法解决此问题:
Number(Math.round(100 - (price / listprice) * 100 + 'e2') + 'e-2');
添加 .toFixed(2) 以获得您想要的两位小数。
Number(Math.round(100 - (price / listprice) * 100 + 'e2') + 'e-2').toFixed(2);
您可以创建一个函数来为您处理舍入:
function round(value, decimals) {
return Number(Math.round(value + 'e' + decimals) + 'e-' + decimals);
}
示例:https : //jsfiddle.net/k5tpq3pd/36/
另类
您可以使用原型向 Number 添加圆形函数。我不建议在这里添加 .toFixed() 因为它会返回一个字符串而不是数字。
Number.prototype.round = function(decimals) {
return Number((Math.round(this + "e" + decimals) + "e-" + decimals));
}
并像这样使用它:
var numberToRound = 100 - (price / listprice) * 100;
numberToRound.round(2);
numberToRound.round(2).toFixed(2); //Converts it to string with two decimals
示例 https://jsfiddle.net/k5tpq3pd/35/
资料来源:http : //www.jacklmoore.com/notes/rounding-in-javascript/
要获得两位小数的结果,您可以这样做:
var discount = Math.round((100 - (price / listprice) * 100) * 100) / 100;
要舍入的值乘以 100 保留前两位数字,然后除以 100 得到实际结果。
我发现的最好和最简单的解决方案是
function round(value, decimals) {
return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}
round(1.005, 2); // 1.01