金融类app各种数值的精确计算问题 ##
最近总算闲下来了,有时间把前段时间app里边踩到的坑总结下,既金融类app中有关数值精确计算的问题。
1.简单粗暴的方法—doubleValue解决
刚开始接手的项目中关于数值的计算就是按照字符串直接转doubleValue的方式转化为后进行加减乘除运算。这样做在大多数情况下是不会有问题的,但如果经过全面测试的话,有些字符串转double会出现精度损失问题,计算结果也会出现不准确的问题,一个最近踩过的坑就是用户再输入投资金额的时候会对自己账户中的可用余额进行判断,以确定余额是否充足,测试的时候输入很多数据都没问题,但线上用户大量数据就会出现偶尔数据错误,用户输入金额明明和可用余额一样,但判断的时候就会提示可用余额不足,老板使用过程中也遇到过,还找了我好几次,汗,都是之前开发人员的坑。所以记住这丫简单粗暴的方法针对金融类的对数据精度及其敏感的项目不可取。
2.明智之举—NSDecimalNumber
NSDecimalNumber是苹果提供的专门金融货币精确数值计算的API。
+ (instancetype)decimalNumberHandlerWithRoundingMode:(NSRoundingMode)roundingMode
scale:(short)scale
raiseOnExactness:(BOOL)raiseOnExactness
raiseOnOverflow:(BOOL)raiseOnOverflow
raiseOnUnderflow:(BOOL)raiseOnUnderflow
raiseOnDivideByZero:(BOOL)raiseOnDivideByZero
参数 | 说明 |
---|---|
roundingMode | 要使用的舍入模式,有四种值: NSRoundUp, NSRoundDown, NSRoundPlain, and NSRoundBankers |