2014-02-18 141 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」。 –