关于浮点数问题的一点思考

最近工作中遇到一个浮点数引起的问题,由于要计算费用,结果因为汇率的精度问题,导致计算不准确,给业务带来一些麻烦。

其实不少技术人员也多少了解过浮点数这样那样的问题,对于如何处理也可以使用网上的建议方案,使用bigdecimal解决,不过对于为什么会这样还是不理解,感觉浮点数计算问题高深莫测、难以预测。

由于我们在数学中学过四舍五入的近似舍入的方法,但是直接拿来用于开发是有问题的。首先四舍五入法是十进制的舍入法,而计算机本质上都是二进制,二者在进位上并不一致。浮点数不精准问题本质上就是二进制位数受限制引起的问题,比如java中float型总共是4字节32位,其中有效位数是23位(bit),一位符号,8位阶码(用于在有效位数上乘以2的幂次)。二进制默认的舍入方法是向偶数舍入方法,当然这种方法理解上也有点难度,但是至少与四舍五入方法没有直接对应关系,只要正好卡在第23位就需要舍入,因此会出现最后一位是5以上(十进制)依然可能会在二进制中被舍弃的情况,这也就是很多人感到迷惑的原因。double类型机制一样,位数不一样而已,当然精度更高。

二进制比较容易出现精度问题,比如0.1在二进制中无法全部表示(类似于十进制除不尽),只能近似表示,十进制中的数值只有正好是2的幂次的组合才容易用有限位数表示。有兴趣的人可以研究一下。

 

你可能感兴趣的:(关于浮点数问题的一点思考)