一尘不染

JavaScript数学,四舍五入到小数点后两位[重复]

javascript

我有以下JavaScript语法:

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

这四舍五入为整数。如何返回两位小数的结果?


阅读 239

收藏
2020-04-25

共1个答案

一尘不染

注-如果3位数精度很重要,请参阅编辑4

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

toFixed将根据超过2个小数的值为您舍入或舍入。

编辑 -正如其他人所提到的,它将结果转换为字符串。为了避免这种情况:

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

编辑2-
正如注释中所提到的,此函数在某种程度上会失败,例如在1.005的情况下,它将返回1.00而不是1.01。如果准确性在这个程度上很重要,这似乎与我尝试过的所有测试都很好。

但是,需要进行一些小的修改,上面链接的答案中的函数在四舍五入时将返回整数,因此例如99.004将返回99而不是99.00,这对于显示价格而言并不理想。

编辑3- 似乎在实际收益表上固定了TOST仍在搞砸一些数字,此最终编辑似乎有效。哎呀,这么多返工!

   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));
   }

编辑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(2);
    if( negative ) {    
        n = (n * -1).toFixed(2);
    }
    return n;
}
2020-04-25