2011-03-25 64 views
0
Why this condition is never true ? Both parts of the equation are integers, so there must be equality for index = 0, 10, 20, 30, 40. I am compiling this code using g++. 

for(int index = 0; index < 50; index++){ 

     if ((int) (10 * ( 0.1 * index) == (int)(10 * (int) (0.1 * index)))) 
     { 
       std::cout << "equal"; 
     } 
} 

隨着MSVS 2010編譯器不會發生這些問題的平等......C++,用G ++

0 0 
    1 0 
    2 0 
    3 0 
    4 0 
    5 0 
    6 0 
    7 0 
    8 0 
    9 0 
    10 10 
    11 10 
    12 10 
    13 10 
    14 10 
    15 10 
    16 10 
    17 10 
    18 10 
    19 10 
    20 20 
    21 20 
    22 20 
    23 20 
    24 20 
    25 20 
    26 20 
    27 20 
    28 20 
    29 20 
    30 30 
    31 30 
    32 30 
    33 30 
    34 30 
    35 30 
    36 30 
    37 30 
    38 30 
    39 30 
    40 40 
    41 40 
    42 40 
    40 40 
    44 40 
    45 40 
    46 40 
    47 40 
    48 40 
    49 40 
+0

這是因爲在平等的第二部分你用「(int)」來整數。 10 *(int)的(0.1 *指數),15就變成 10 *(int)的(0.1 * 15),這成爲 10 *((int)的1.5)變成 10 * 1 – sashoalm 2011-03-25 17:44:06

+0

克的哪個版本++你正在用嗎?適用於我。 – jbp 2011-03-25 17:39:20

回答

11

你的括號是錯誤的:

if ((int) (10 * ( 0.1 * index) == (int)(10 * (int) (0.1 * index)))) 

應該是:

if ((int) (10 * ( 0.1 * index)) == (int)(10 * (int) (0.1 * index))) 
+0

(+1)斑點! – NPE 2011-03-25 17:38:57

+0

謝謝,它的工作原理... – johny 2011-03-25 17:43:16

0

你比較兩個浮點數 - 0.1 *指數。

您是否嘗試過打印出各個組件時不是等於?我懷疑你會發現在這個等式的某個地方,結果會有所不同。

0

這是因爲在第二部分,你有(INT)(0.1 *指數)。所以(INT)(0.1 * 5)變圓0

-1

嘗試

for(int index = 0; index < 50; index++){ 

     if ((int) (10 * ( 0.1 * (double)index)) == (int)(10 * (int) (0.1 * (double)index))) 
     { 
       std::cout << "equal"; 
     } 
} 
+0

-1:爲什麼不試圖將變量的名稱從'index'更改爲'i'?爲什麼不嘗試使用'stdio.h'而不是'iostream'?爲什麼不嘗試使用'unsigned'而不是'int'? ......「嘗試」(如果我們排除諸如性能或用戶界面設計等一些領域)在編程中沒有意義。想想,然後做,或不。沒有嘗試。 – 6502 2011-03-25 17:54:37

+0

說你會怎麼樣,我試過,它的工作:) RAD編程是代碼首先想想以後。這一切都取決於你在做什麼...... – 2011-03-25 17:56:06

+0

這是因爲你沒有一個正確的「工作」的概念(這並不意味着你發現至少有一個案例,它給出了你認爲正確的結果)。儘管「嘗試看」一般對於編程來說是不好的,但它在C++中是一種真正的自殺,因爲語言會用未定義的行爲守護進程來懲罰你的錯誤,而不是用運行時錯誤天使來懲罰你的錯誤。 – 6502 2011-03-25 18:07:01

0

雙方不都是整數:

10 * (0.1 * index) 

是雙,並且使用0.1,作爲你可能知道不能完全用IEEE754格式表示(只有當n> = 0時,才能完全表示的值是1 /(2^n)的整數倍)。爲了與人類通常使用的底座10平行,電腦會看到0.1或多或少像你看到的那樣0.3333333333333...(並且你沒有使用無限紙來記錄所有那些三)。

你應該遵循ybungalobill的建議,順便說一句,對我來說,使用基於整數算術和模運算符的不同方法解決問題會容易得多。

if (index % 10 == 0) 

似乎是你正在尋找的測試。