Как выразить большие числа с двумя десятичными разрядами в 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-е РЕДАКТИРОВАНИЕ:
Также смотрите эту ссылку, предоставленную Рафаэлем
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
аргумент, а не с плавающей точкой один.