我有以下JavaScript语法:

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

这是整数。我如何返回两个小数点后的结果?


当前回答

说明—如果3位精度很重要,请参见编辑4

var discount = (price / listprice).toFixed(2);

固定将四舍五入为您取决于值超过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 -你们真是要了我的命。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;
}

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

其他回答

最快的方式-比toFixed()快:

两位小数

x      = .123456
result = Math.round(x * 100) / 100  // result .12

三位小数

x      = .123456
result = Math.round(x * 1000) / 1000      // result .123

我认为我见过最好的方法是乘以10的位数次方,然后做个数学。四舍五入,最后除以10的数字次方。下面是我在typescript中使用的一个简单函数:

function roundToXDigits(value: number, digits: number) {
    value = value * Math.pow(10, digits);
    value = Math.round(value);
    value = value / Math.pow(10, digits);
    return value;
}

或者纯javascript:

function roundToXDigits(value, digits) {
    if(!digits){
        digits = 2;
    }
    value = value * Math.pow(10, digits);
    value = Math.round(value);
    value = value / Math.pow(10, digits);
    return value;
}

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

例如:+ discount.toFixed (2)

尝试使用discount.toFixed(2);

我找到的最好最简单的解决办法是

function round(value, decimals) {
 return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}   
round(1.005, 2); // 1.01