1

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

1 回答 1

2

欢迎来到浮点舍入错误!

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

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

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

于 2013-10-30T16:52:02.067 回答