Проблема круглых чисел - PullRequest
       1

Проблема круглых чисел

2 голосов
/ 02 августа 2011

У меня проблема с этим кодом:

<?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 ]

4 голосов
/ 02 августа 2011

Попробуйте использовать:

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 голос
/ 02 августа 2011

Проверьте это: вы можете использовать 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...