【发布时间】:2014-08-22 10:53:32
【问题描述】:
我有一个我现在无法更改的系统,是使用浮点数来存储信息。
我遇到了舍入错误的问题。示例:
std::string floatToStr(float d)
{
std::stringstream ss;
ss << std::fixed << std::setprecision(15) << d;
return ss.str();
}
float val723 = 0.575f;
std::cout << floatToStr(val723) << std::endl;
结果是
0.574999988079071
我可以用字符串处理来纠正这个问题。
std::string doubleToStr(double d, int precision)
{
std::stringstream ss;
ss << std::fixed << std::setprecision(precision) << d;
return ss.str();
}
double val945 = (double)0.575f;
std::cout << doubleToStr(atof(doubleToStr(val945, 4).c_str()), 15) << std::endl;
结果是:
0.575000000000000
但这是一个昂贵的解决方案。有没有更好的解决方案可以在实时过程中使用? (实际上我不需要在我的实时代码中使用它,但如果我必须在实时代码中使用它,我会做好准备。)
Edit1:我知道浮点类型可以使用小数点后的 6 或 7 位数字。
【问题讨论】:
-
如果您需要使用
float,您不能期望超过 7 个(左右)十进制数字的精度。如果您需要更多数字,您将不得不忍受使用double(或者可能是一些用户定义的十进制类型,以准确表示您的值)的成本。恐怕没有办法从float中获得更高的精度。 -
是否可以选择二进制保存?
标签: c++ floating-point