printf-as3 icon indicating copy to clipboard operation
printf-as3 copied to clipboard

Rounding

Open ghost opened this issue 12 years ago • 1 comments

Commit: b74c6a1effcbd3ef8de35479d70b10696d99c80a

when some one does:

printf("%.2f", 0.0000000007)

It becomes: 0.1 ??

ghost avatar Nov 09 '12 14:11 ghost

Hi,

I was experimenting with number roundings...

Maybe you guys could look at: http://code.google.com/p/bigdecimal/ and http://stackoverflow.com/questions/632802/how-to-deal-with-number-precision-in-actionscript

I think bigdecimal could be a solution?

Here a very fast sloppy example:


<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
    <![CDATA[

    import flash.events.Event;
    import spark.components.HSlider;
    import spark.components.TextInput;

    [Bindable]
    private var minimumRawValue:Number = 0;

    [Bindable]
    private var maximumRawValue:Number = 0.00000000007;


    private function applicationEventListener( event:Event ):void
    {
        rawNumberSlider.addEventListener(Event.CHANGE, rawNumberSliderEventListener, false, 0, true );
        minimumInput.addEventListener(Event.CHANGE, minmaxInputEventListener, false, 0, true );
        maximumInput.addEventListener(Event.CHANGE, minmaxInputEventListener, false, 0, true );

        minimumInput.text = minimumRawValue.toString();
        maximumInput.text = maximumRawValue.toString();

    }

    private function setPrecision(number:Number, precision:int):Number
    {
        precision = Math.pow(10, precision);
        return (Math.round(number * precision)/precision);
    }

    private function toFixed( number:Number, factor:Number ):Number
    {
        return (Math.round(number * factor)/factor);
    }

    private function rawNumberSliderEventListener( event:Event ):void
    {
        var rawSlider:Number = (event.target as HSlider).value;
        rawNumer.text = rawSlider.toString();

        var decimals:uint = uint(decimalsInput.text);


        // Test 1:
        formatted1.text = printf( "%."+decimals+"f", rawSlider );


        //Test 2:
        var factor:uint = Math.pow( 10, decimals );
        formatted2.text = toFixed( rawSlider, factor ).toString();



        // Test 3:
        var bdValue:BigDecimal = new BigDecimal( rawSlider );
        bdValue = bdValue.setScale( decimals, MathContext.ROUND_HALF_UP );

        formatted3.text = bdValue.toString();

    }

    private function minmaxInputEventListener( event:Event ):void
    {
        switch ( (event.currentTarget as TextInput).id )
        {
            case "minimumInput":
                minimumRawValue = Number((event.currentTarget as TextInput).text);
                break;
            case "maximumInput":
                maximumRawValue = Number((event.currentTarget as TextInput).text);
                break;
            default:
                trace( "Whoops" );              
        }
    }


    ]]>
</fx:Script>
<s:Panel width="100%" height="100%">
    <s:VGroup height="100%" width="100%">
        <s:Form height="100%" width="100%">

             <s:FormHeading label="Simulator"/>

            <s:FormItem label="Minimum">
                <s:TextInput id="minimumInput" />
            </s:FormItem>
            <s:FormItem label="Maximum">
                <s:TextInput id="maximumInput" />
            </s:FormItem>

            <s:FormItem label="Decimals">
                <s:TextInput id="decimalsInput" text="2" />
            </s:FormItem>

            <s:FormItem>
                <s:HSlider  id="rawNumberSlider"
                            snapInterval="{maximumRawValue/1000}"
                            stepSize="{maximumRawValue/100}"
                            minimum="{minimumRawValue}"
                            maximum="{maximumRawValue}"
                            percentWidth="100" />
            </s:FormItem>

            <s:FormItem label="Raw Output">
                <s:TextInput toolTip="rawSlider.toString()" id="rawNumer" />
            </s:FormItem>

            <mx:HRule width="100%" height="1"/>

            <s:Label text="formated:" />

            <s:FormItem label="printf :-(">
                <s:TextInput id="formatted1" />
            </s:FormItem>

            <s:FormItem label="custom to fixed :-)">
                <s:TextInput id="formatted2" />
            </s:FormItem>

            <s:FormItem label="BigDecimal :-D">
                <s:TextInput id="formatted3" />
            </s:FormItem>
        </s:Form>


    </s:VGroup>
</s:Panel>  

/s:Application

ghost avatar Nov 11 '12 14:11 ghost