8

I used below two methods :

Number.prototype.myRound = function (decimalPlaces) {
    var multiplier = Math.pow(10, decimalPlaces);

    return (Math.round(this * multiplier) / multiplier);
};
alert((239.525).myRound(2));

Mathematically alert should be 239.53 but its giving 239.52 as output. So i tried using .toFixed() function & i got proper answer.

But when i try to get answer for 239.575 it gives again wrong output.

alert((239.575).toFixed(2));

Here output should be 239.58 instead its giving 239.57.

This error creating a bit difference in final output. So can anyone help me to sort this out?

Tony
  • 7,345
  • 3
  • 26
  • 34
Surendra
  • 237
  • 3
  • 6
  • 19

8 Answers8

11

This method will give very correct round result.

function RoundNum(num, length) { 
    var number = Math.round(num * Math.pow(10, length)) / Math.pow(10, length);
    return number;
}

Just call this method.

alert(RoundNum(192.168,2));
WilQu
  • 7,131
  • 6
  • 30
  • 38
Kumod Singh
  • 2,113
  • 1
  • 16
  • 18
  • Its working fine. Its working for all conditions. Thank you very much. – Surendra Dec 25 '13 at 09:41
  • 1
    As mentioned by TJ Crowder in http://stackoverflow.com/questions/10015027/javascript-tofixed-not-rounding, try RoundNum(35.855, 2). A better answer may be the Decimal Rounding Example in https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round – theycallmethesloth Apr 21 '14 at 19:15
  • 10
    RoundNum(1.005,2) is rounded as 1, but expected 1.01 – A Kunin Jan 23 '17 at 04:36
7

Internally, 239.575 cannot be represented exactly. In binary, 0.575 would be something like 1/2 + 1/16 + 1/128 + 1/256 + ....

It just so happens that, represented in binary, the result is slightly less than 239.575. Therefore, Math.round rounds down.

To demonstrate, try this:

alert(239.575 - 239.5)

You would expect the result to be 0.075, but instead you get 0.07499999999998863.

Niet the Dark Absol
  • 320,036
  • 81
  • 464
  • 592
  • Though it is true, I haven't ever seen such *'problems'* in other languages... That's definitely what must be improved in JavaScript. – VisioN Dec 20 '13 at 10:17
  • @VisioN It's true of any language that uses double-precision floating-point numbers. Which is almost all of them, except those with fixed-point or arbitrary-precision systems. – Niet the Dark Absol Dec 20 '13 at 10:19
3

Just use Math.round

function round(figureToRound){
    var roundOff = Math.round((figureToRound* 100 ).toFixed(2))/100;
    return roundOff;
}

console.log(round(1.005));

This will help the rounding off issue completely.

Mohammad
  • 21,175
  • 15
  • 55
  • 84
Srinath Mahe
  • 91
  • 1
  • 7
2

round() will do the trick.Try This:

var v= Math.round(239.575 * 100) / 100;
alert(v);

Working FIddle

Milind Anantwar
  • 81,290
  • 25
  • 94
  • 125
2

The problem is probably floating point inaccuracy, thus you might get different results in different cases (different gathering of a number, different browsers etc.).

See also this: toFixed(2) rounds "x.525" inconsistently?

Community
  • 1
  • 1
Cedric Reichenbach
  • 8,970
  • 6
  • 54
  • 89
0

In my software I use this:

(require DecimalJS)

Number.prototype.toFixed = function(fixed) {
    return (new Decimal(Number(this))).toFixed(parseFloat(fixed) || 
0);
};


var x = 1.005;
console.log( x.toFixed(2) ); //1.01
icy
  • 1,468
  • 3
  • 16
  • 36
0
function bestRound(val, decimals){
    decimals = decimals || 2;
    var multiplier = Math.pow(10, decimals)
    return Math.round((val * multiplier ).toFixed(decimals)) / multiplier;
  }

bestRound(239.575 - 239.5)   0.08
bestRound(239.575)         239.58
bestRound(239.525)         239.53
bestRound(1.005)             1.01
googamanga
  • 172
  • 1
  • 8
0

I got this to simply overwrite it ->

Number.prototype.toFixed = function(fractionDigits, returnAsString = true) {
    var digits = parseInt(fractionDigits) || 0;
    var num = Number(this);
    if( isNaN(num) ) {
        return 'NaN';
    }
    
    var sign = num < 0 ? -1 : 1;
    if (sign < 0) { num = -num; }
    digits = Math.pow(10, digits);
    num *= digits;
    //num = Math.round(num.toFixed(12));
    num = Math.round( Math.round(num * Math.pow(10,12)) / Math.pow(10,12) );
    var ret = sign * num / digits;
    return (returnAsString ? ret.toString() : ret ); // tofixed returns as string always
}
DavidDunham
  • 1,245
  • 1
  • 22
  • 44