c ++中的十进制精度错误

时间:2013-10-30 16:42:58

标签: c++ decimal

我正在编写一个代码,用于将小数从一元转换为二进制,如果它可以准确翻译,或者如果不能则返回错误消息。以下是我的代码。我对十进制错误感到困惑。在一步中,n之前是1.12,temp是1,但输出是0.12001,如何避免这种错误?

list<bool> binary_decimal(double n, bool& flag){
    list<bool> li;
    list<double> left;
    flag = true;
    n = n - (int)n;
    left.push_back(n);
    while(n){
        n = n * 2;
        cout << "n before " << n << endl;  //test area
        li.push_back(n >= 1);
        int temp = (int)n;
        cout << "temp " << temp << endl;  // test area
        n = n - temp;
        cout << "n now = " << n << endl;  //test area
        for(list<double>:: iterator it = left.begin(); it != left.end(); it++){
            if(*it == n){
                cout << "error!";
                flag = false;
                return li;
            }
        }
        left.push_back(n);
    }
    return li;
}

1 个答案:

答案 0 :(得分:2)

欢迎使用浮点舍入错误!

数字0.12不能表示为终止二进制分数,因此会出现舍入误差。

您可以明确计算每个数字以避免错误。可以根据任意精度算术或“滚动自己的”计算引擎来思考。

或者,另一种选择是四舍五入到你需要的地方数量。在这里,四位小数就足够了。