最近接手一个项目,收拾一堆的剩下的烂摊子,有相关金额的部分,现场反应接收到的json数据在显示和计算时,有的时候会有1分钱的误差,关于钱的事情是绝对不可能允许的。原因其实很简单,查看了一下代码,在用MJExtension接收数据时,全部选用的是float类型来接收,在需要使用高精度的时候,我们一定要使用double类型。
float:单精度浮点;double:双精度浮点。具体的概念表示范围大家可以自己搜,我想说的是,单精度浮点的误差可能要超过我们的想象,看下面一种情况:
这三条大概就能看出swift中Double和Float的区别,在金额的表达中float是完全不可用的,swift中Double可以满足我们的正常要求,问题只是在运算过程中,double运算的CPU占用率要高于float,所以在精度要求不高的时候,尽量使用float。
当然swift中表达金额有更高级更可靠的方式,如NSDecimalNumber,这是个精度更高的类,还有一个git上专门负责货币的库https://github.com/flight-school/money,真的有需求要做进出口货币转换的,大家有兴趣可以研究下。