2014-10-06 8 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

Альтернативой является «конец с« концом »или любым другим текстом и сделать ваше условие цикла« while (cin) »(или даже лучше,« while (cin >> input) »и избавиться от два других дублирующих экземпляра 'cin >> input'). Если они вводят что-то, что не является допустимым float, тогда цикл завершится. –

ответ

6

0.1 в состоянии (input != 0.1) является double ближе к рациональному 1/10. float, ближайший к этому рациональному, 0.1f, представляет другое значение и не делает это условие истинным.

Если вы хотите использовать float в своей программе, используйте (input != 0.1f) как соответствующее условие.

+6

И вообще вы никогда не должны сравнивать числа с плавающей запятой для равенства. См. Http://stackoverflow.com/questions/588004/is-floating-point-math-broken – o11c

+0

@ o11c Я согласен с тобой! –

+1

@ o11c Я сравниваю числа с плавающей запятой для равенства все время. –

1

Вы должны явно привести 0.1 к float как:

while(input != (float)0.1) 

Лучше использовать явные преобразования при сравнении чисел с плавающей запятой.

+0

Сравнение двух чисел с плавающей запятой опасно, если не сегодня, в 7 лет это будет. –

+0

Не только это, нет необходимости бросать константу. Просто добавьте 'f'. – Yamakuzure

+2

Хотя он работает на 0,1, в общем случае нет гарантии, что преобразование двойного литерала в float даст поплавок, ближайший к номинальному значению литерала. Существуют исключения, когда двухступенчатое округление, от десятичной до двойной и от двойной к плавающей, вводит дополнительную ошибку округления. –

Смежные вопросы