手动解析double时避免舍入错误
Avoid rounding error when manually parsing double
我想为双精度值实现一个简单的解析器(只是为了好玩)。但是,我注意到在处理十进制移位时,将值乘以 10 的幂时出现舍入错误。
我想知道 double.Parse
如何确保结果值尽可能接近字符串值?
举个例子:
解析 0.0124 (=124*0.0001) 时,我得到 0.012400000000000001。但是,double.Parse
按预期显示 0.0124。
解决方案似乎很简单:
只是不要乘以小于 1 的值(例如上例中的 0.0001),而是除以 1/x(上例中的 10000)。
我认为原因很简单,整数值具有精确表示(最多 2^53),因此商没有舍入误差(因为因子 < 1)。
我想为双精度值实现一个简单的解析器(只是为了好玩)。但是,我注意到在处理十进制移位时,将值乘以 10 的幂时出现舍入错误。
我想知道 double.Parse
如何确保结果值尽可能接近字符串值?
举个例子:
解析 0.0124 (=124*0.0001) 时,我得到 0.012400000000000001。但是,double.Parse
按预期显示 0.0124。
解决方案似乎很简单: 只是不要乘以小于 1 的值(例如上例中的 0.0001),而是除以 1/x(上例中的 10000)。
我认为原因很简单,整数值具有精确表示(最多 2^53),因此商没有舍入误差(因为因子 < 1)。