我正在编写一个代码,用于将小数从一元转换为二进制,如果它可以准确翻译,或者如果不能则返回错误消息。以下是我的代码。我对十进制错误感到困惑。在一步中,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 :(得分:2)
欢迎使用浮点舍入错误!
数字0.12不能表示为终止二进制分数,因此会出现舍入误差。
您可以明确计算每个数字以避免错误。可以根据任意精度算术或“滚动自己的”计算引擎来思考。
或者,另一种选择是四舍五入到你需要的地方数量。在这里,四位小数就足够了。