Как выразить большие числа с двумя десятичными разрядами в C++ Calculator

Я пытаюсь написать калькулятор на C++, который выполняет основные функции /, *, - или + и показывает ответ с двумя десятичными знаками (с точностью до 0,01).

Например 100.1 * 100.1 должен распечатать результат как 10020.01 но вместо этого я получаю -4e-171, Насколько я понимаю, это от переполнения, но именно поэтому я выбрал long double на первом месте!

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

long double getUserInput()
{
    cout << "Please enter a number: \n";
    long double x;
    cin >> x;
    return x;
}

char getMathematicalOperation()
{
    cout << "Please enter which operator you want "
            "(add +, subtract -, multiply *, or divide /): \n";
    char o;
    cin >> o;
    return o;
}

long double calculateResult(long double nX, char o, long double nY)
{
// note: we use the == operator to compare two values to see if they are equal
// we need to use if statements here because there's no direct way 
// to convert chOperation into the appropriate operator

if (o == '+') // if user chose addition
    return nX + nY; // execute this line
if (o == '-') // if user chose subtraction
    return nX - nY; // execute this line
if (o == '*') // if user chose multiplication
    return nX * nY; // execute this line
if (o == '/') // if user chose division
    return nX / nY; // execute this line
return -1; // default "error" value in case user passed in an invalid chOperation
}

void printResult(long double x)
{
    cout << "The answer is: " << setprecision(0.01) << x << "\n";
}

long double calc()
{
// Get first number from user
    long double nInput1 = getUserInput();

// Get mathematical operations from user
    char o = getMathematicalOperation();

// Get second number from user
    long double nInput2 = getUserInput();

// Calculate result and store in temporary variable (for readability/debug-ability)
    long double nResult = calculateResult(nInput1, o, nInput2);

// Print result
    printResult(nResult);
    return 0;
}

4 ответа

Решение

Это не из-за переполнения вы получите странный результат. Двойники могут легко содержать числа в диапазоне, который вы показываете.

Попробуйте напечатать результат без установленной точности.

РЕДАКТИРОВАТЬ: после попытки

long double x = 100.1;
cout << x << endl;

Я вижу, что это не работает в моей системе Windows.

Поэтому я немного искал и нашел:

печатать длинные двойные на окнах

может быть, это объяснение.

Так я попробовал

long double x = 100.1;
cout << (double)x << endl;

который работал нормально.

2-е РЕДАКТИРОВАНИЕ:

Также смотрите эту ссылку, предоставленную Рафаэлем

http://oldwiki.mingw.org/index.php/long%20double

setprecision говорит, сколько десятичных разрядов вы хотите как int так что вы на самом деле устанавливаете его setprecision(0) поскольку 0.01 обрезать В вашем случае вы хотите, чтобы он был установлен на 2. Вы также должны использовать std::fixed или вы получите научные цифры.

void printResult(long double x)
{
    cout << "The answer is: " << std::fixed << setprecision(2) << x << "\n";
}

рабочий пример

Презентация с плавающей точкой по умолчанию автоматически переключается между 314.15 а также 3.1e2, в зависимости от размера номера и максимального количества цифр, которые он может использовать. В этой презентации точность - это максимальное количество цифр. По умолчанию это 6.

Вы можете либо увеличить максимальное количество цифр, так что ваш результат может быть представлен как 314.15или вы можете принудительно использовать такую ​​запись с фиксированной точкой, используя std::fixed Манипулятор. С std::fixed точность - это количество десятичных знаков.

Однако с std::fixed очень большие и очень маленькие числа могут быть довольно нечитаемыми.

setprecision() Манипулятор указывает количество цифр после десятичной точки. Итак, если вы хотите 100.01 быть напечатанным, использовать setprecision(2),

Когда вы используете setprecision(0.01), Значение 0.01 превращается в int, который будет иметь значение 0,

Это не повредило бы, если бы вы прочитали документацию setprecision() - это четко определяет int аргумент, а не с плавающей точкой один.

Другие вопросы по тегам