已经有一段时间,但似乎无法做到这一点。我知道使用setprecision()来截断用户输入的值,但我不确定如何验证它并告诉用户"该值超过2位小数;它被截断了。"
void decimalFormat(string &point)
{
int decimal;
decimal = point.find('.');
if(decimal>2)
{
for(int x= decimal-2; x > 0; x -=2)
cout<<"Only two decimal places are allowed. Truncating the remainder..."<< point.erase(x);
}
}
答案 0 :(得分:0)
setprecision()
实际上并没有截断用户输入,它只是在你输出变量时设置小数位数。
例如:
#include <iostream>
#include <iomanip>
using namespace std;
main () {
float test = 4.556454636382;
cout << setprecision(11) << test << endl;
cout << setprecision(8) << test << endl;
cout << setprecision(2) << test << endl;
//set precision back up to 11
cout << setprecision(11) << test << endl;
}
结果
4.5564546585
4.5564547
4.6
4.5564546585
我不知道这是否能回答你的问题,但它只是对setprecision()
如何工作的解释,因为你看到它实际上并没有改变测试变量的值(因为即使之后)输出被截断,你仍然可以选择再次显示11的精度),它只是确定用户看到的内容。
这有助于解释你的要求吗?
答案 1 :(得分:0)
<强>更新强>
所以这是尝试解决问题的一种黑客方式,但我想我已经找到了一些东西。所以这是我认为解决问题的代码,我会尽力解释,但如果您有任何问题请告诉我。
因此变量“test”将通过您的2十进制标准,但第二个变量“test2”则不会。所以我所做的是将每个变量乘以1000,这意味着如果原始变量只有2个小数点,则结果数字的最后一位数(test * 1000)将为零。
因此,如果您将任意数字的剩余(%)乘以2位小数乘以1,000,则为零。
#include <iostream>
using namespace std;
main () {
float test = 3.14;
float test2 = 3.145;
test = test * 1000;
test2 = test2 * 1000;
if ((int)test%10 != 0)
cout << "FALSE" << endl;
else
cout << "TRUE" << endl;
if ((int)test2%10 != 0)
cout << "FALSE" << endl;
else
cout << "TRUE" << endl;
}
<强>输出强>
TRUE
FALSE
因此,对于您的代码
#include <iostream>
#include <iomanip>
using namespace std;
main () {
float num;
float num2;
cout << "Enter a number (maximum 2 decimal places): ";
cin >> num;
num2 = num * 1000;
if ((int)num2%10 != 0)
cout << "You have entered a number with more than 2 decimal places, your number is being truncated." << endl;
else
cout << fixed << setprecision(2) << num << endl;
}
我在终端中尝试输出
myterminalstuff$ ./dec Enter a number (maximum 2 decimal places): 3.14
3.14
myterminalstuff$ ./dec Enter a number (maximum 2 decimal places): 3.1456
You have entered a number with more than 2 decimal places, your number is being truncated.
这可能是一种更简单的方法,我只是不知道。如果你需要我解释任何一个更好的让我知道,我会尽我所能。