2010-06-27 175 views
15

也許,這是一個非常簡單的問題,但我無法得到答案。我一直在尋找相當長一段時間(現在的谷歌認爲我發送自動查詢http://twitter.com/michaelsync/status/17177278608)..C++ float to int

int n = 4.35 *100; 
cout << n; 

爲什麼成爲「434」,而不是「435」的輸出? 4.35 * 100 = 435這是一個整數值,這應該可以分配給整數變量「n」,對吧?

OR C++編譯器在乘法之前是否將4.35轉換爲整數?我認爲它不會。爲什麼編譯器會自動將4.35更改爲4.34,它仍然是一個浮點數?

謝謝。

+3

如果4.35在乘法之前被轉換爲「int」,結果如何爲434?那不是400嗎?只是爲了排除你的一個解釋。 – pmr 2010-06-27 16:27:45

+0

如果你做了int y =(int)(4.35 * 100);你不會 - 如果你打算調用一個函數,你可以選擇一個合適的函數來得到你需要的答案,也可以在C++中完成。但是在示例代碼中,您並未調用函數,而是使用由該語言提供的隱式類型轉換。 – 2010-06-27 16:39:23

+2

4.35不完全可以表示。下一個最接近的double值似乎是(在你的情況下)4.34999 ...,乘以100,結果是434.999 ...,因此轉換爲434. – sellibitze 2010-06-27 17:39:49

回答

36

What Every Computer Scientist Should Know About Floating-Point Arithmetic

這真的只是一個起點,可悲的是,正如當時的語言介紹自己的弱點,當他們做類型轉換,等等。在你僅僅創造了這個情況的情況下不斷的4.35所能沒有精確表示,因此4.35 * 100更像434.9999999999,並且int轉換爲trunc,而不是round

+0

它只是在C++中嗎?它不會發生在C#中。int n = Convert.ToInt32(4.35 * 100); Console.WriteLine(n); – 2010-06-27 16:34:51

+0

它確實發生在C#中,如果你投了,但你沒有投射 - ToInt32輪(因爲它非常清楚地在文檔中說明)。你也可以用C++進行四捨五入(好吧,'floor'或者'ceil',但是加/減0.5來做一個舍入函數) – 2010-06-27 16:36:41

+0

好吧..明白了..謝謝.. – 2010-06-27 16:41:39

2

4.35的內部結果最終爲4.349999999或類似結果。乘以100位十進制數,當轉換爲int時,.9999將被刪除(截斷)。

編輯:正在尋找尼克發佈的鏈接。 :)

7

如果你運行這個語句:

cout << 4.35 

美元,甜甜圈,你得到的東西幾乎相當於4.3499998821因爲4.35是不是在一個浮動精確表示。

當編譯器將float轉換爲int時,它會截斷。

爲了讓您的期望的行爲,請嘗試:

int n = floor((4.35 * 100.0) + 0.5);

(與floor的trickyness是因爲C++不具有天然round()功能)

0

浮點數don't work that way。許多(大多數,技術上無限數量...)值不能被精確地存儲或操作爲浮點。 4.35似乎是其中之一。它被存儲爲實際低於4.35的東西,因此您的結果。

0

float轉換爲int小數部分被截斷,轉換不採取最近intfloat中值。

4.35不能準確地表示爲float,最近表示數是(我們可以推斷)略微小於4.35,即4.34999 ......,所以當乘以100,你會得到434.999 ...

如果您想將積極的float轉換爲最近的int,那麼在轉換爲int之前,您應該先加0.5。

E.g.

int n = (4.35 * 100) + 0.5; 
cout << n;