ios开发中,在接收后台数据的时候会先转换为对象,最后转化为我们想要的数据类型.
那么数字是怎么样的一个过程呢??
后台传给我们一个数字,后台可以定义为 Number
类型,也可以定义成 String类型.当后台返回来一个NSString
类型,在iOS json
序列化的时候,会把字符串类型转化为NSString
对象.当后台传给我们的是number类型,我们拿到json数据后,会把数据转化成NSNumber
对象类型,使用的时候会把NSNumber
转化为我们想要的类型.
但是接收数据的时候,我们需要把number转化为NSString
类型,会出现转化不准确的现象,比如后台定义了一个82.4,我们接收到数据,并转化为NSString类型,结果会显示出82.39999999999999999.试过几次后发现是double转化为NSNumber的时候除了问题.double表示的字面值和其存储的值一般是不一样的,转化为NSNumber之后,有很大一些数字,在NSNumber的stringValue上会出错。
解决方法:可以是取String
的doubleValue
,然后再.2f保留两位小数进行构造字符串。千万不能取floatValue
,floatValue
在大于15万的浮点数字就会出现不精确了 。而doubleValue在数十亿的范围内都是字面上精确的。
根本解决方法还是让后台的同事把请求返回的数据全部设置为String
类型
如果涉及到计算的问题,那就只得乖乖转化为NSDecimalNumber
对象了。
在开发中,关于价格金额的计算往往是比较严格的,试想一下,支付宝每次转钱的时候,少转了1分钱,你会开心吗?
在显示金额的时候,最后这些数据都由后台确定,移动端直接显示,不要进行转换.如果必要的时候,真的需要进行计算,请使用NSDecimalNumber
来进行计算,这是这是一个高精度的类,专门用于计算金额.