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

2020/09/27 18:41 · javascript ·  · 0评论

我有以下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/zh-CN/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这似乎与我尝试过的所有测试均能很好地工作。

但是,需要进行一些小的修改,上面链接的答案中的函数在四舍五入时返回整数,因此例如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));
   }

请参阅此处的小提琴示例: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/

如果您使用一元加号将字符串转换为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

尝试使用 discount.toFixed(2);

我认为我看过的最好方法是将10乘以数字的幂,然后进行Math.round,最后将10除以数字的幂。这是我在打字稿中使用的简单函数:

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

接受的答案略有不同。
toFixed(2)返回一个字符串,您将始终获得两个小数位。这些可能为零。如果您想抑制最终的零,只需执行以下操作:

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

编辑:我刚刚发现了Firefox 35.0.1中的一个bug,这意味着以上内容可能为NaN提供了一些值。

我已将代码更改为

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

这给出了一个最多两个小数位的数字。如果要三个,则将乘以1000,以此类推。

OP始终希望保留两位小数,但是如果toFixed()在Firefox中损坏,则需要先修复。


参见
https://bugzilla.mozilla.org/show_bug.cgi?id=1134388

最快的方法 -比toFixed()更快:

两个小数

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

三小数

x      = .123456
result = Math.round(x * 1000) / 1000      // result .123
    function round(num,dec)
    {
      num = Math.round(num+'e'+dec)
      return Number(num+'e-'+dec)
    }
      //Round to a decimal of your choosing:
    round(1.3453,2)

要处理四舍五入到任意小数位数,具有两行代码的函数就可以满足大多数需求。这是一些示例代码。



    var testNum = 134.9567654;
    var decPl = 2;
    var testRes = roundDec(testNum,decPl);  
    alert (testNum + ' rounded to ' + decPl + ' decimal places is ' + testRes);

    function roundDec(nbr,dec_places){
        var mult = Math.pow(10,dec_places);
        return Math.round(nbr * mult) / mult;
    }

function discoverOriginalPrice(discountedPrice, salePercentage) {
  var originalPrice = discountedPrice / (1 - (salePercentage * .01));
  return +originalPrice.toFixed(2);
}

这是一个有效的例子

var value=200.2365455;
result=Math.round(value*100)/100    //result will be 200.24
本文地址:http://javascript.askforanswer.com/javascriptshuxuesishewurudaoxiaoshudianhouliangweizhongfu.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!