截断到2位小数并通知用户

时间:2015-11-29 04:17:00

标签: c++

已经有一段时间,但似乎无法做到这一点。我知道使用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);
}
}

2 个答案:

答案 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.

这可能是一种更简单的方法,我只是不知道。如果你需要我解释任何一个更好的让我知道,我会尽我所能。