JavaScript 数学,四舍五入到小数点后两位

2022-08-29 23:06:55

我有以下JavaScript语法:

var discount = Math.round(100 - (price / listprice) * 100);

这将向上舍入为整数。如何返回两位小数的结果?


答案 1

注意 - 如果 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 - 似乎在实际回报上固定仍然搞砸了一些数字,这个最终的编辑似乎有效。哎呀这么多返工!

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 - 你们正在杀了我。编辑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;
}

小提琴:https://jsfiddle.net/3Lbhfy5s/79/


答案 2

如果您使用一元加号将字符串转换为 MDN 上记录的数字。

例如:+discount.toFixed(2)