2011-09-25 151 views
0

我寫了一個很長的帖子,試圖解釋所遇到的問題IM的具體細節,而是我覺得生病保持它的簡單,在這裏問一個例子問題:閃光AS3四捨五入的數字自動

var n1:Number = 9.99999999999999; 
n1 += 0.000000000000009; 
var n2:Number = n1 + 10; 
var n3:Number = n1 - 10; 

朗故事短,n1 = 9.99 .... 7,n2 = 20,n3 = 10.

如果我試圖對n1和n3進行比較,它們應該是相同的,但它們是無效的。我不在乎閃光是否輪到它,我只是需要它們是相同的(並且它們不是在一種情況下引起閃光,而不是在另一種情況下閃光)。

有沒有這樣的問題的一些標準的解決方案?

P.S.我不需要這個精度在我的數字,但我也不想微觀管理數字的舍入每次我做一個操縱(這似乎可以添加很多代碼混合)。但是,如果這是唯一的解決方案,那麼我認爲在整個代碼中必須做大量的四捨五入,哈。

+0

你的意思是'n3 = n2 - 10'不是'n3 = n1 - 10',對嗎? – Cameron

+1

使用「舍入數字」的訣竅是完全避免IEEE 754浮點數,並堅持整數。 – Cameron

回答

1

flash中的Number是一個雙精度浮點數。閱讀更多關於它們的here。這些「問題」並非閃存所獨有,而只是與這些數字的存儲方式有關。

有幾個選項。這是一個quick little library模糊比較數字,在一定的誤差範圍內。另一種選擇是實施fixed point math library

+0

儘管這確實回答了我的問題,但它並沒有給我我希望的「簡單」解決方案。非常感謝你的幫助! – William

0

如果您要比較,只是換一個int()就會出問題嗎?

trace(int(n1) == int(n3));