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 ); }




