JavaScriptmath,小数点后两位

我有下面的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

编辑 – 正如其他人所说,这将结果转换为一个string。 为了避免这一点:

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

编辑2 – 也如注释中提到的,这个函数以某种精度失败,例如在1.005的情况下,它将返回1.00而不是1.01。 如果精度达到这个程度是重要的,我已经find了这个答案: https : //stackoverflow.com/a/32605063/1726511这似乎与所有我试过的testing很好。

有一个小的修改需要,虽然上面链接的答案中的函数返回一个整数时,例如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(2); if( negative ) { n = (n * -1).toFixed(2); } return n; } 

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

如果您使用一个加号将string转换为MDN中logging的数字。

例如: +discount.toFixed(2)

函数Math.round()和.toFixed()意味着四舍五入到最接近的整数,并且在处理小数时可能会得到一些不需要的错误,并且对Math.round()或参数使用“multiply and divide” .toFixed()。 例如,如果您尝试使用Math.round(1.005 * 100)/ 100来舍入1.005,那么您将得到1的结果,而1.00使用.toFixed(2)而不是得到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/

吴国良

您可以使用原型向数字添加一个循环函数。 我不会build议在这里添加.toFixed(),因为它会返回一个string而不是数字。

 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得到实际结果。

尝试使用discount.toFixed(2);

接受的答案的一个小变化。 toFixed(2)返回一个string,并且总是会得到两位小数。 这些可能是零。 如果您想要抑制最终的零(s),只需执行以下操作:

 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 

我find的最好和简单的解决scheme是

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

参考: http : //www.jacklmoore.com/notes/rounding-in-javascript/

我认为我所看到的最好的方法是把数字乘以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; } 

要处理四舍五入到任意数量的小数位,具有两行代码的函数将满足大多数需要。 这里有一些示例代码来玩。

 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); } 
  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 value=200.2365455; result=Math.round(value*100)/100 //result will be 200.24