Round to a decimal place

snipped by coreyloose

public class RoundToDecimal
{
	public static function roundToDecimal( numberToRound:Number, toDecimalPlace:Number ) : Number{
		trace( "Checking for Rounding: "+numberToRound +" to "+toDecimalPlace+" places" );
 
   		//rounding to 0 decimals, use numberToRound dummy
   		if( toDecimalPlace == 0 ){
   			trace( "  Rounding to 0 decimals." );
   			return Math.round(numberToRound);
  		}
 
   		var splitByDecimalArray:Array = numberToRound.toString().split(".");
 
   		//no decimals in number given, just return
   		if( splitByDecimalArray.length <= 1 ){
   			trace( "  No decimals." );
   			return numberToRound;
   		}
 
   		var decimalArray:Array = splitByDecimalArray[1].split("");	
 
   		//less decimals then rounding asked for, just return	
   		if( decimalArray.length < toDecimalPlace ){
   			trace( "  Less decimals then needed. / "+decimalArray.length );
   			return numberToRound;
 		}
 
   		trace( "  Non-trival Round to " + toDecimalPlace + " decimals" );
   		trace( "  Left=="+splitByDecimalArray[0]+" / Right=="+splitByDecimalArray[1] );
 
   		recursiveCheckRound( decimalArray, toDecimalPlace, toDecimalPlace );
 
   		if( Number( decimalArray[0] ) == 10 ){
   			decimalArray[0] = "0";
 
   			var newLeftOfDecimalNumber:Number
   			if( splitByDecimalArray[0].charAt(0) == "-" )
   				newLeftOfDecimalNumber = Number( splitByDecimalArray[0] ) - 1;
   			else
   				newLeftOfDecimalNumber = Number( splitByDecimalArray[0] ) + 1;
 
   			splitByDecimalArray[0] = newLeftOfDecimalNumber.toString();
   		}
 
   		var result:String = splitByDecimalArray[0] + ".";
   		for( var i:Number = 0; i<toDecimalPlace; i++ ){
   			result += decimalArray[i];
   		}
 
   		trace( "  Could it be " + Number(result) );
 
   		return Number(result);
   	}
 
   	private static function recursiveCheckRound( decimalArray:Array, currentLocation:Number, roundTo:Number ) : void{
   		trace( "  Rounding decimal ." +decimalArray[currentLocation]+ " to "+ Math.round( Number( "."+decimalArray[currentLocation] ) ));
   		if( decimalArray[currentLocation] != "10" ){
   			if( Math.round( Number( "."+decimalArray[currentLocation] ) ) == 0 )
   				return;
   			if( currentLocation < roundTo )
   				return;
   		}else{
   			if( currentLocation > 0 )decimalArray[currentLocation] = "0";
   			else return;
   		}
 
   		if( currentLocation == 0 ) 
   			return;
 
   		currentLocation--;
   		var newDigit:Number = Number( decimalArray[currentLocation] ) + 1;
   		decimalArray[currentLocation] = newDigit.toString();
 
   		recursiveCheckRound( decimalArray, currentLocation, roundTo);
   	}
 
}

usage

public function testRoundUp():void{
	assertTrue( RoundToDecimal.roundToDecimal( 5.86, 1 ) == 5.9 );
	assertTrue( RoundToDecimal.roundToDecimal( 9.2229, 3 ) == 9.223 );
	assertTrue( RoundToDecimal.roundToDecimal( 9.2229, 2 ) == 9.22 );
	assertTrue( RoundToDecimal.roundToDecimal( 12.899, 2 ) == 12.90 );
	assertTrue( RoundToDecimal.roundToDecimal( 100.999, 2 ) == 101.00 );
	assertTrue( RoundToDecimal.roundToDecimal( -52.1248, 3 ) == -52.125 );
	assertTrue( RoundToDecimal.roundToDecimal( -1250.899, 2 ) == -1250.9 );
	assertTrue( RoundToDecimal.roundToDecimal( -1250.999, 2 ) == -1251 );
	assertTrue( RoundToDecimal.roundToDecimal( -0.9999, 2 ) == -1 );
}
 
public function testRoundDown():void{
	assertTrue( RoundToDecimal.roundToDecimal( 5.81, 1 ) == 5.8 );
	assertTrue( RoundToDecimal.roundToDecimal( 9.2221, 3 ) == 9.222 );
	assertTrue( RoundToDecimal.roundToDecimal( 9.2221, 2 ) == 9.22 );
	assertTrue( RoundToDecimal.roundToDecimal( 12.811, 2 ) == 12.81 );
	assertTrue( RoundToDecimal.roundToDecimal( 100.001, 2 ) == 100.00 );
	assertTrue( RoundToDecimal.roundToDecimal( -52.1242, 3 ) == -52.124 );
	assertTrue( RoundToDecimal.roundToDecimal( -1250.801, 2 ) == -1250.80 );
	assertTrue( RoundToDecimal.roundToDecimal( -1250.001, 2 ) == -1250.00 );
	assertTrue( RoundToDecimal.roundToDecimal( 0.00001, 2 ) == 0 );
	assertTrue( RoundToDecimal.roundToDecimal( -0.00002, 3 ) == 0 );
	assertTrue( RoundToDecimal.roundToDecimal( 199.00000000000003, 1) == 199 );
}