我的程序中有一个奇怪的行为,其中double正在失去精度。我的cout正在显示正确的值,但行为仍然出乎意料。因此我调试,发现甚至gdb显示意外的值。 以下只是简化的方案:
double length =2.11;
//gdb shows 2.10 here but prints 2.11 correctly using cout at the end
cout<<"length; //It prints 2.11 correctly here
在生产场景中很难找到这样的问题,因为调试不是一种选择,唯一的选择就是使用尽可能多的打印件。 有什么建议我可以避免这个问题吗?
答案 0 :(得分:6)
假设IEEE754双精度浮点数,最接近double
到2.11的值略小
2.109999999999999875655021241982467472553253173828125
std::cout
非常聪明,默认情况下适当地舍入,但gdb似乎截断为2位小数。
答案 1 :(得分:2)
鉴于实数与你的情况一样,我担心没有太多可做的事情。您可以计划避免它,并创建空间以对双值执行相等性检查。
以下是两个看似合理的黑客:
1:[在大学项目中尝试过]为了处理10 ^ -4的数字,使用整数和因子值。示例:存储1.2345,存储整数12345,因子存储为10000.现在您可以正确打印,这也可以进行相等检查。
2:如果已知双精度值的精度,则可以使用偏移量。示例:如果2.109999具有2位小数的精度,请使用以下内容: (int)((2.109999 + .005)* 100)。然后相应地打印。
但这两种黑客都假定如下:
1:您可以控制值的准确性。 2:你真的需要打印准确的数值。