с плавающей запятой — Как выразить большие числа с двумя десятичными разрядами в 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;
}

0

Решение

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

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

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

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

2

Другие решения

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

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

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

4

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

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

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

2

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

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

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

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector