2014-10-06 73 views
1

我有兩個輸入,唯一的區別是我在第二個輸入中將「double」替換爲「float」。然而,第一個可以按預期運行,但不是第二個。第二個不會以0.1的輸入結束。任何人對此有一些想法?非常感謝!在這個輸入中float和double有什麼區別?

第一輸入:

#include <iostream> 

using namespace std; 

int main() 
{ 
    double input; 
    input = 0; 
    double sum = 0; 
    cout << "Please enter a series numbers and end with 0.1: "; 
    cin >> input; 
    while (input != 0.1) 
    { 
     sum += input; 
     cout << "The cumulative sum is: " << sum << endl; 
     cin >> input; 
    } 
    return 0; 
} 


Please enter a series numbers and end with 0.1: 1 2 3 0.1 
The cumulative sum is: 1 
The cumulative sum is: 3 
The cumulative sum is: 6 

第二輸入:

#include <iostream> 
using namespace std; 

int main() 
{ 
    float input; 
    input = 0; 
    float sum = 0; 
    cout << "Please enter a series numbers and end with 0.1: "; 
    cin >> input; 
    while (input != 0.1) 
    { 
     sum += input; 
     cout << "The cumulative sum is: " << sum << endl; 
     cin >> input; 
    } 
    return 0; 
} 


Please enter a series numbers and end with 0.1: 1 2 3 0.1 
The cumulative sum is: 1 
The cumulative sum is: 3 
The cumulative sum is: 6 
The cumulative sum is: 6.1 
+0

另一種方法是說「以'end'結尾'」或任何其他文本,並且讓你的循環條件爲'while(cin)'(或者甚至更好,while(cin >> input))並且擺脫另外兩個'cin >> input'的重複實例)。如果他們輸入的東西不是有效的浮點數,那麼循環將結束。 – 2014-10-06 06:35:18

回答

6

在條件(input != 0.1)0.1最接近理性1/10 double。最接近這個理性的float表示一個不同的值,並且不會使這個條件成立。

如果要在程序中使用float,請使用(input != 0.1f)作爲相應的條件。

+6

而且一般來說,不應該爲浮點數進行比較。見http://stackoverflow.com/questions/588004/is-floating-point-math-broken – o11c 2014-10-06 05:40:09

+0

@ o11c我同意你! – 2014-10-06 06:16:05

+1

@ o11c我一直比較浮點數的相等性。 – 2014-10-06 06:19:02

1

你必須明確地投0.1float,如:

while(input != (float)0.1) 

最好是在比較浮點數使用顯式轉換。

+0

比較兩個浮點數是危險的,如果不是現在這將是7年。 – 2014-10-06 06:15:25

+0

不僅如此,沒有必要施展一個常數。只需附加一個'f'即可。 – Yamakuzure 2014-10-06 06:45:27

+2

雖然它適用於0.1,但通常不能保證將雙字面轉換爲浮點數會使浮點數接近文字的名義值。有兩個例外,從小數到雙精度,從雙精度到浮點精度,引入了附加舍入誤差。 – 2014-10-06 12:46:25

相關問題