2011-05-27 55 views
2

我的問題很簡單來形容,在柔性:的Flex/AS3很奇怪簡單的數字運算問題

0.8 - 0.2 = 0.6000000000000001 

之前任何人得到這個,我敢肯定,前兩個成員是0.8和0.2,是數類,爲什麼會發生這種情況?

還有一件事,我從*類型轉換的價值是這樣的:

var value:*=0.8; 
var castValue:Number = Number(value); 

但僅此而已,如果我跟蹤value我得到0.8不0.800000000000001什麼的。

回答

4

這是全部語言中的一個相當普遍的問題,因爲Floating Point Number Precision。沒有什麼可以做的,因爲它是所有機器都可能出現的錯誤值。

你可以做的是設置你從數要精確:

trace(castValue.toFixed(5)); // Gives five decimals after the point 

很多時候,閃光燈四捨五入這些在數轉換成一個串號你(視覺顯示),它將大部分這些錯誤從可見的用戶中移除。

+0

'toFixed'解決我的問題, 謝謝! – 2011-05-27 16:10:13

+0

+1很好的答案。 AS3文檔實際上解釋了由於CPU體系結構不同而導致在不同機器上涉及浮點數的操作的稍微不同的值,正如所指出的那樣,這對於任何語言都是期望的。 – 2011-05-27 20:04:17

1

基本上,有一些數字不能完全用二進制表示。

雖然this page about floating point numbers是關於Java而不是Actionscript,但在很多語言中存在困難。這篇文章中有一部分內容(請參閱「舍入錯誤」)提到了數字問題,例如.6

這是一個長時間閱讀,但我發現它很有幫助(而不是像this page about Floating-Point Arithmetic那樣長或數學重)。

+0

的確,好點,但奇怪的是,這個工作很好'var a:* = -8; \t \t \t \t var castA:Number = Number(a); \t \t \t \t跡(卡斯塔) \t \t \t \t變種B:* = -2; \t \t \t \t var castB:Number = Number(b); \t \t \t \t跟蹤(castB) \t \t \t \t跟蹤(卡斯塔-castB);' – 2011-05-27 16:05:43

+0

並且仍然值是一樣的,所以,可能是有毛病我的代碼...... – 2011-05-27 16:06:26