如何在 C++ 计算器中将大数表示为小数点后两位
How to express large numbers to two decimal places in 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;
}
你得到奇怪的结果并不是因为溢出。双打可以轻松地将数字保持在您显示的范围内。
尝试在没有设置精度的情况下打印结果。
编辑:
尝试后
long double x = 100.1;
cout << x << endl;
我发现它在我的 Windows 系统上不起作用。
所以我搜索了一下发现:
print long double on windows
也许这就是解释。
所以我尝试了
long double x = 100.1;
cout << (double)x << endl;
效果很好。
第二次编辑:
另请参阅 Raphael
提供的 link
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
参数,而不是浮点数。
我正在尝试用 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 系统上不起作用。
所以我搜索了一下发现:
print long double on windows
也许这就是解释。
所以我尝试了
long double x = 100.1;
cout << (double)x << endl;
效果很好。
第二次编辑:
另请参阅 Raphael
提供的 linksetprecision
告诉它你想要多少小数位作为 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
参数,而不是浮点数。