2010-01-20 42 views
1

IM,即時試圖的像素值變換到毫米和扭轉它。簡單計算問題與具有柔性計算一個麻煩的Flex

開始接觸69.8:

Calculating MM to pixel from: 69.8 mm 
69.8*300 = 20940 
20940/2.54 = 8244.094488188975 
8244.094488188975/10 = 824.4094488188975 

,計算回:

Calculating pixel to MM from: 824.4094488188975 
824.4094488188975/300 = 2.7480314960629917 
2.7480314960629917 * 2.54 = 6.979999999999999 
6.979999999999999 * 10 = 69.79999999999998 

我們想要69.8,但結束了69.79999999999998。 我跟蹤了使用簡單的Windows Calc的過程,第一個錯誤的地方是20940/2.54 = 8244.094488188975,應該是8244,094488188976。在這個

安妮的幫助將是巨大的。

+4

每個計算機科學家應該知道的關於浮點運算的知識http://docs.sun.com/source/806-3568/ncg_goldberg。html – Amarghosh 2010-01-20 10:53:11

+0

我重新標記了這個以增加數學,我認爲這個問題和答案會幫助其他人,並希望這會導致更多的人看到它。 – invertedSpear 2010-01-20 15:43:42

回答

7

好,因爲它是關於一般的編程,這是沒有那麼多一個Flex問題。你有沒有想過計算機中儲存的數字的確切程度?細節更多的是真實的數學,但我會盡量簡化。你知道有無數個不同的實數(例如像實線上的點),但是在你的計算機中,你將所有的東西都存儲爲零和一,以及有限的一些(32或64「比特」)。所以現在我們有一個問題 - 如何在有限的空間內表示無限數量的數字。浮點數中使用的想法(可以使用像「1.03」或「4.2232」這樣的「點」的值)是因爲你不能全部擁有它們,所以將數字四捨五入到最接近的數字。

這是一個有點像記住某人多少糖放入他的咖啡,你不記得了,他喜歡有糖的1.1232湯匙,因爲表勺子只是沒有在測量的東西的確切數額良好在上面。你把它四捨五入到大多數情況下都可以正常工作。因此,與浮點數類似的說法能夠成立,一個額外的扭曲

- 該數字比遠離它,這裏的「空的空間」他們之間得到的真正的大接近0稠密得多。例如,如果您從最大值中減去10000,則數字可能會相同,因爲沒有數字接近它,因此在查找最接近的數字時會有所不同。

trace (Number.MAX_VALUE == Number.MAX_VALUE-10000); 
    // returns "true" 
    trace (200000 == 200000 - 10000); 
    // returns "false" 

所以你的問題來自於假設的數字是完全準確的,而他們都沒有,你總是把事情四捨五入。 as3中的Number遵循雙精度IEEE-754標準,這就是它如何決定它具有哪個數字以及哪個數字四捨五入的方式。

看看這個:

trace (8244.094488188976); 
// returns "8244.094488188975" 

延伸閱讀:

Floating point

IEEE_754-2008

+0

Btw。一個簡單的解決方法是將最終數字舍入到所需的精度。畢竟,我認爲你不關心小數點後面的第15個數字;) – 2010-01-20 10:27:09

+0

不知道我如何使用Flex做到這一點。謝謝你的回答和解釋。 – eldamar 2010-01-20 11:00:05

+2

@eldamar:如果您有一個數字'n',請使用'n.toPrecision(1)'將包含該數字的字符串保存到一位小數位。 – 2010-01-20 11:15:50