Как я могу принять ввод как двойной и выполнить IF ELSE заявление - PullRequest
1 голос
/ 10 октября 2019
#include <iostream>
#include <sstream>

using namespace std;
using std::stringstream;
using std::cout;

int main()
{
    double value;
    cout << "Enter a number : " << endl;
    cin >> value;
    cout << "The exact number : ";
    cout << value << endl;
    system("pause");
}

После того, как я написал этот код, я обнаружил, что в выражении IF ELSE будет округлено двойное число каждой переменной, как я могу принять точное значение ввода для оператора IF ELSE? Например: ввод - 0,007447, и если ввод меньше или равен 0,007447, он запросит другой ввод. Но в этом случае после ввода пользователем 0,007447 и округления до 0,00745, таким образом, он выполняет оператор else, но не оператор if.

1 Ответ

1 голос
/ 10 октября 2019

На моей платформе изменение константы на long double константу исправило неправильное поведение.

Числа с плавающей запятой (float, double, long double) не являются математически действительными числами. Вместо того, чтобы иметь ограниченную точность.

Подробнее на Что должен знать каждый учёный-информатор об арифметике с плавающей запятой .

Кроме того, ваш пример был намного больше, чем вам было нужнобыть. Минимальный пример можно легко выразить так (включая «исправить»):

#include <iostream>
#include <sstream>

using std::stringstream;
using std::cout;

int main() {
    long double value;
    stringstream ss("0.007447");
    ss >> value;
    if (value <= 0.007447) {
        cout << "value <= 0.007447 ==> TRUE -- as expected\n";
    } else {
        cout << "value <= 0.007447 ==> FALSE -- unexpected!\n";
    }

    if (value <= 0.007447L) {
        cout << "value <= 0.007447L ==> TRUE -- as expected\n";
    } else {
        cout << "value <= 0.007447L ==> FALSE -- unexpected!\n";
    }
}
...