今天创建订单时候,遇到这样一个问题:客户端创建一个2.10元的订单,在服务端接收到订单处理好数据,到微信接口创建微信订单。这时候通过扫描微信订单,显示出来的钱是2.09元,比之前少了0.01元。
首先想到的是因为转化过程出现精度丢失问题。服务端处理逻辑:(go代码)123function getPrice(price float32) int64 { return int64(price * 100)}
为什么会出现浮点数转化成整数,出现精度丢失呢?
现在先来看下0.1转化成2进制:1234560.1 * 16 = 1.6 ===> 取1 => 00010.6 * 16 = 9.6 ===> 取9 => 10010.6 * 16 = 9.6 ===> 取9 => 1001....进入循环0.0001 1001 1001 1001 ...
现在讲0.1的二进制转化成十进制:123这个是js语法:Math.pow(2,-4)+Math.pow(2, -5)+Math.pow(2,-8)+Math.pow(2,-9)+Math.pow(2,-12)+..这个值算出来0.099853515625接近0.1