Как распечатать двойное значение без потери первой цифры - PullRequest
0 голосов
/ 12 февраля 2019

Когда я запускаю свой код, он печатает только десятичные части двойного числа.На другой странице я взял введенный дубль и распечатал его так, как он был введен.Но для следующего кода он печатает только десятичные дроби.Например, когда я ввожу 1,95, он выводит только 0,95.Почему удаляется первая цифра?Я не вижу в своем коде ничего, что бы указывало на это.

Я уже пробовал это более простым способом, и это сработало.И я не вижу никаких проблем, которые могли бы испортить двойной код в моем коде.

#include <iostream>
using namespace std;

int main()
{
double price;
char user_input;
do
{
    cout << "Enter the purchase price (xx.xx) or `q' to quit: ";
    cin >> user_input;
    if (user_input == 'q')
    {
        return 0;
    }
    else
    {
        cin >> price;
        int multiple = price * 100;
        if (multiple % 5 == 0)
        {
            break;
        }
        else
        {
            cout << "Illegal price: Must be a non-negative multiple of 5 cents.\n" << endl;
        }
    }
} while (user_input != 'q');

cout << price << endl;
}

Когда я ввожу 1,95, я получаю 0,95.Но на выходе должно быть 1.95.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Проблема, описанная в другом ответе: чтение для 'q' удаляет первый символ из потока, прежде чем он может быть проанализирован в double.

Решение: сначала прочитайте double.Если чтение не удалось, проверьте, является ли ввод 'q'.

#include <iostream>
#include <limits>
using namespace std;

int main()
{
    double price;
    while (true)
    {
        cout << "Enter the purchase price (xx.xx) or `q' to quit: ";
        if (cin >> price)
        {
            // use price
        }
        else // reading price failed. Find out why.
        {
            if (!cin.eof()) // didn't hit the end of the stream
            {
                // clear fail flag
                cin.clear();
                char user_input;
                if (cin >> user_input && user_input == 'q') // test for q
                {
                    break; // note: Not return. Cannot print price if the
                           // program returns
                }
                // Not a q or not readable. clean up whatever crap is still
                // in the stream
                cin.clear();
                cin.ignore(numeric_limits<streamsize>::max(), '\n');
            }
            else

            {
                // someone closed the stream. Not much you can do here but exit
                cerr << "Stream closed or broken. Cannot continue.";
                return -1;

            }
        }
    }

    cout << price << endl;// Undefined behaviour if price was never set.
}

Другой разумной альтернативой является чтение всего ввода как std::string.Если string не "q", попытайтесь преобразовать его в double с std::stod или std::istringstream.

0 голосов
/ 12 февраля 2019

Когда вы набираете 1.95 в командной строке, переменной user_input присваивается значение «1», а price - .95.

...