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