2014-02-18 103 views
0

我在Flash中有两个按钮。目标是当你点击一个时,计数器将增加1.9,如果你点击另一个,它将减少1.9。但是,当您尝试将数字增加/减少1.9时,点击几下后,数学会稍微偏离。该数字应该是一位或两位小数。Actionscript 3计算器差异

var count1:uint = 0; 
var unit:Number = 0; 

add1_btn.addEventListener(MouseEvent.CLICK, add1); 
take1_btn.addEventListener(MouseEvent.CLICK, take1); 
counter1.text = '0'; 

function add1(event:Event):void 
{ 
count1++; 
counter1.text = count1.toString(); 
unit+= 1.9; 
var unitRound= int((unit)*10)/10; 
units.text = unitRound.toString(); 
} 

function take1(event:Event):void 
{ 
count1--; 
counter1.text = count1.toString(); 
unit-= 1.9; 
var unitRound= int((unit)*10)/10; 
units.text = unitRound.toString(); 
} 

回答

1

您遇到的是Flash的添加浮动数字的方法的十进制不精确。

要解决这个问题,您可以执行以下操作。我只是改变了添加的方式,正因为如此,它可以让我摆脱您使用的unitRound变量,同时仍然保持您需要的单精度精度。

var count1:uint = 0; 
var unit:Number = 0; 

add1_btn.addEventListener(MouseEvent.CLICK, add1); 
take1_btn.addEventListener(MouseEvent.CLICK, take1); 
counter1.text = '0'; 

function add1(event:Event):void 
{ 
    count1++; 
    counter1.text = count1.toString(); 
    unit = ((unit*10) + 19)/10; 
    units.text = unit.toString(); 
} 

function take1(event:Event):void 
{ 
    count1--; 
    counter1.text = count1.toString(); 
    unit = ((unit*10) - 19)/10; 
    units.text = unit.toString(); 
} 

另一个略有清洁方法I came across其中有类似的功能是什么我想出了,但更容易,如果需要修改:

var count1:uint = 0; 
var unit:Number = 0; 

add1_btn.addEventListener(MouseEvent.CLICK, add1); 
take1_btn.addEventListener(MouseEvent.CLICK, take1); 
counter1.text = '0'; 

function add1(event:Event):void 
{ 
    count1++; 
    counter1.text = count1.toString(); 
    unit = toFixed(unit + 1.9,10); 
    units.text = unit.toString(); 
} 

function take1(event:Event):void 
{ 
    count1--; 
    counter1.text = count1.toString(); 
    unit = toFixed(unit - 1.9,10); 
    units.text = unit.toString(); 
} 

var toFixed:Function = function(number:Number, factor:int) { 
    return Math.round(number * factor)/factor; 
} 
+1

为了记录,浮点问题不是Flash/ActionScript特定的。更多关于这个问题在http://floating-point-gui.de/ –

1

这是你的工作,当任何一台电脑上体验一番十进制值。

所有编程语言中最简单的解决方法可能是将解决方案重写为如下所示: (关键是要保留正在迭代的内容以清除小数点,然后将其乘以某些值以获得“最终”值)。

var _index:int = 0; 

add1_btn.addEventListener(MouseEvent.CLICK, add1); 
take1_btn.addEventListener(MouseEvent.CLICK, take1); 
counter1.text = '0'; 

function add1(event:Event):void 
{ 
_index++; 
units.text = (_index * 1.9).toString(); 
} 

function take1(event:Event):void 
{ 
_index--; 
units.text = (_index * 1.9).toString(); 
} 
+0

+ 1的解释和一般建议,但我相信现在的示例代码,不会解决问题,并仍然产生像“5.699999999999999”。 –