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

我有以下JavaScript语法:

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

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

801020 次浏览

说明—如果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/

你们真是要了我的命。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/

尝试使用discount.toFixed(2);

要得到两个小数的结果,你可以这样做:

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

要四舍五入的值乘以100以保留前两位数字,然后除以100以得到实际结果。

如果使用一元加号将字符串转换为数字MDN上的文档

例如:+discount.toFixed(2)

对公认答案的一个小变化。 toFixed(2)返回一个字符串,你总是会得到两位小数点后的数字。这些可能是零。如果你想抑制最后的0 (s),只需这样做:

var discount = + ((price / listprice).toFixed(2));
< p >编辑: 我刚刚在Firefox 35.0.1中发现了一个错误,这意味着上面可能会给出具有某些值的NaN 我将代码更改为

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

这给出了一个小数点后最多两位的数字。如果你想要3,你可以乘1000,然后除以1000,以此类推 OP总是需要两个小数点后的位置,但是如果toFixed()在Firefox中被破坏了,它需要首先修复 看到https://bugzilla.mozilla.org/show_bug.cgi?id=1134388 < / p >

函数Math.round().toFixed()意味着舍入到最接近的整数。在处理小数和使用“乘除”运算时,你会得到不正确的结果。Math.round()的方法或.toFixed()的参数。例如,如果你尝试使用Math.round(1.005 * 100) / 1001.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);
}
< p >的例子: https://jsfiddle.net/k5tpq3pd/36/ < / p >

替代

可以使用prototype向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
< p >的例子 https://jsfiddle.net/k5tpq3pd/35/ < / p >

来源:http://www.jacklmoore.com/notes/rounding-in-javascript/

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

两位小数

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

三位小数

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

下面是一个工作示例

var value=200.2365455;
result=Math.round(value*100)/100    //result will be 200.24

要处理四舍五入到任何小数点后数位的问题,包含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 round(value, decimals) {
return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}
round(1.005, 2); // 1.01
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)

我认为我见过最好的方法是乘以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;
}