Friday, July 17, 2009

Round a Large Decimal Number in Javascript

There might be a situation where you need to round a very large decimal number in JavaScript. But using the built-in JavaScript methods you wont be able to get it done with the precision you want to get. So here i am trying to give you a method to round any digits of decimal number with the precision you want to get.


/**
* Method to round decimal numbers
* number - The number that must be rounded
* decimals - The number of decimal points that should appear in the result
*/
function roundNumber(number, decimals)
{
//return roundNumber(number,decimals);
var newString;// The new rounded number
decimals = Number(decimals);
if (decimals < 1) {
newString = (Math.round(number)).toString();
} else {
var numString = number.toString();
if(numString.trim().length == 0) {
numString = "0.00";
}
if(numString.indexOf(".") == 0) {
numString = "0" + numString;
}
if(parseFloat(numString) == 0) {
numString = "0.00";
}
if (numString.lastIndexOf(".") == -1) {// If there is no decimal point
numString += ".";// give it one at the end
}
var cutoff = numString.lastIndexOf(".") + decimals;// The point at which to truncate the number
var d1 = Number(numString.substring(cutoff,cutoff+1));// The value of the last decimal place that we'll end up with
var d2 = Number(numString.substring(cutoff+1,cutoff+2));// The next decimal, after the last one we want
if (d2 >= 5) {// Do we need to round up at all? If not, the string will just be truncated
if (d1 == 9 && cutoff > 0) {// If the last digit is 9, find a new cutoff point
while (cutoff > 0 && (d1 == 9 || isNaN(d1))) {
if (d1 != ".") {
cutoff -= 1;
d1 = Number(numString.substring(cutoff,cutoff+1));
} else {
cutoff -= 1;
}
}
}
d1 += 1;
}
newString = numString.substring(0,cutoff) + d1.toString();
}
if (newString.lastIndexOf(".") == -1) {// Do this again, to the new string
newString += ".";
}
var decs = (newString.substring(newString.lastIndexOf(".")+1)).length;
for(var i=0;i<decimals-decs;i++) newString += "0";
return newString;
}

No comments: