Round Number问题flex

时间:2011-08-02 10:23:12

标签: flex

我对此代码有疑问:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                   xmlns:s="library://ns.adobe.com/flex/spark"
                   xmlns:mx="library://ns.adobe.com/flex/mx"
                   showStatusBar="false"
                   width="250" height="31">
<s:layout>
    <s:HorizontalLayout gap="10" paddingBottom="10" paddingLeft="10" paddingRight="10"
                        paddingTop="10" verticalAlign="middle"/>
</s:layout>
<fx:Script>
    <![CDATA[
        [Bindable]
        private var i:Number = 1.0;

        private function click(e:MouseEvent):void
        {
            if (e.currentTarget == plus)
                i += .1;
            if (e.currentTarget == minus)
                i -= .1;
        }
    ]]>
</fx:Script>
<s:Button id="plus" width="30" label="+" click="click(event)"/>
<s:Button id="minus" width="30" label="-" click="click(event)"/>
<s:Label text="{i}"/>

当我点击'+'时,我得到了 1.1(好)
1.2000000000000002(而不是1.2)
1.3000000000000003(而不是1.3)
1.4000000000000004(而不是1.4)
1.5000000000000004(而不是1.5)
1.6000000000000005(而不是1.6)
1.7000000000000006(而不是1.7)
1.8000000000000007(而不是1.8)
1.9000000000000008(而不是1.9)
2.000000000000001(而不是2.0)
...
当我点击' - '时,我得到了 0.9(好)
0.8(好)
0.7000000000000001(而不是0.7)
0.6000000000000001(而不是0.6)
0.5000000000000001(而不是0.5)
0.40000000000000013(而不是0.4)
0.30000000000000016(而不是0.3)
0.20000000000000015(而不是0.2)
0.10000000000000014(而不是0.1)
1.3877787807814457e-16(而不是0.0)
...
我改变了我的功能

private function click(e:MouseEvent):void
{
    if (e.currentTarget == plus)
        i = Math.floor((i + 0.1) * 10) / 10;
    if (e.currentTarget == minus)
        i = Math.floor((i - 0.1) * 10) / 10;
}

当我点击“+”或仅点击“ - ”时,我得到正确的号码 但如果我点击“ - ”直到0.7和“+”,它会保持在0.7
当我点击' - '直到0.9时'+',它保持为0.8左右

为什么呢?如何将数字递增或递减0.1?

2 个答案:

答案 0 :(得分:4)

尝试使用:

private function click(e:MouseEvent):void
{
    if (e.currentTarget == plus)
        i = Math.round((i + 0.1) * 10) / 10;
    if (e.currentTarget == minus)
        i = Math.round((i - 0.1) * 10) / 10;
}

或者在Flex 4.5的情况下:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                   xmlns:s="library://ns.adobe.com/flex/spark"
                   xmlns:mx="library://ns.adobe.com/flex/mx"
                   showStatusBar="false"
                   width="250" height="31">
<s:layout>
    <s:HorizontalLayout gap="10" paddingBottom="10" paddingLeft="10" paddingRight="10"
                        paddingTop="10" verticalAlign="middle"/>
</s:layout>
<fx:Script>
    <![CDATA[
        [Bindable]
        private var i:Number = 1.0;

        private function click(e:MouseEvent):void
        {
            if (e.currentTarget == plus)
                i += .1;
            if (e.currentTarget == minus)
                i -= .1;
        }
    ]]>
</fx:Script>
<fx:Declarations>
    <s:NumberFormatter id="numberFormatter" trailingZeros="true" fractionalDigits="1" />
</fx:Declarations><s:Button id="plus" width="30" label="+" click="click(event)"/>
<s:Button id="minus" width="30" label="-" click="click(event)"/>
<s:Label text="{numberFormatter.format(i)}"/>
</s:WindowedApplication>

或者在Flex 4的情况下:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                   xmlns:s="library://ns.adobe.com/flex/spark"
                   xmlns:mx="library://ns.adobe.com/flex/mx"
                   showStatusBar="false"
                   width="250" height="31">
<s:layout>
    <s:HorizontalLayout gap="10" paddingBottom="10" paddingLeft="10" paddingRight="10"
                        paddingTop="10" verticalAlign="middle"/>
</s:layout>
<fx:Script>
    <![CDATA[
        [Bindable]
        private var i:Number = 1.0;

        private function click(e:MouseEvent):void
        {
            if (e.currentTarget == plus)
                i += .1;
            if (e.currentTarget == minus)
                i -= .1;
        }
    ]]>
</fx:Script>
<fx:Declarations>
    <mx:NumberFormatter id="numberFormatter" precision="1" rounding="nearest" />
</fx:Declarations><s:Button id="plus" width="30" label="+" click="click(event)"/>
<s:Button id="minus" width="30" label="-" click="click(event)"/>
<s:Label text="{numberFormatter.format(i)}"/>
</s:WindowedApplication>

答案 1 :(得分:1)

检查一下: 您可以使用NumberFormatter来正确格式化您的数字,我不是100%确定但使用浮点增量会在小数点处产生一些问题。

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
<s:layout>  
    <s:HorizontalLayout gap="10" paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10" verticalAlign="middle"/>
</s:layout>
<fx:Script>    
    <![CDATA[   
        [Bindable]   
        private var i:Number = 1.0;   
        private function click(e:MouseEvent):void    
        {          
            if (e.currentTarget == plus)   
                i += 0.1;          
            if (e.currentTarget == minus)   
                i -= 0.1;    
        }    
    ]]> 
</fx:Script>
<fx:Declarations>
    <mx:NumberFormatter id="numFormatter" precision="2" rounding="nearest"/>    
</fx:Declarations>

<s:Button id="plus" width="30" label="+" click="click(event)"/> 
<s:Button id="minus" width="30" label="-" click="click(event)"/> 
<s:Label text="{numFormatter.format(i)}"/>
</s:Application>