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

decimal accuracy error in c++

本文关键字:精度 错误 十进制 C++      更新时间:2023-10-16

>我正在编写一个代码,如果可以准确翻译,则将十进制从一元转换为二进制,如果不能,则返回错误消息。以下是我的代码。我对十进制错误感到困惑。一步到位,前面的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;
}

欢迎使用浮点舍入误差!

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

您可以显式计算每个数字以避免错误。 要么沿着任意精度算术的思路思考,要么按照"滚动自己的"计算引擎思考。

或者,另一种选择是四舍五入到您需要的名额。 在这里,小数点后四位就足够了。