ios 浮点数精度问题
2016-03-31 14:44
726 查看
本人是在金融类公司工作,经常涉及到money的计算问题,特别是在算利息这种情况时会遇到除不尽导致小数位数过多的问题。之前一直在写Java,涉及到精度问题,一般用java的BigDecimal就能解决,最近遇到ios项目中一些精度问题,我们平时用的最多的应该是float,double之类的,当然ios还有一个类CGFloat,这个类包含了float和double,然后在计算小数的时候也会有误差。目前测试下来发现在iphone4S或者说在ios7.0上会存在丢失精度的问题,有兴趣的可以试下:
369258147*0.108*365*12/(12*365) + 369258147*0.01*365*12/(12*365)
在ios7.0上,用double类型算出来为43572461.50,而真实的其实为43572461.34。(注:请不要在windows计算器上算,因为我这里的例子比较特殊,除数正好可以被抵消。)
其实我这里要说的是,ios本身也提供了一个类NSDecimalNumber,这个类跟java的BigDecimal类似,也能做高精度浮点数运算,只是写起来稍稍麻烦了点。
double investmentEarnings = plan.investAmount.doubleValue*plan.yearRate.doubleValue*days*plan.typeTerm.integerValue/(12*closeDays);
改进之后
NSDecimalNumber* decInvestmentEarnings = [[[[decInvestAmount decimalNumberByMultiplyingBy:decYearRate] decimalNumberByMultiplyingBy:decDays] decimalNumberByMultiplyingBy:decTypeTerm] decimalNumberByDividingBy:[decMonths decimalNumberByMultiplyingBy:decCloseDays]];
这点跟Java的BigDecimal类似,要用其提供的加减乘除来运算,否则就会导致精度丢失的问题。
369258147*0.108*365*12/(12*365) + 369258147*0.01*365*12/(12*365)
在ios7.0上,用double类型算出来为43572461.50,而真实的其实为43572461.34。(注:请不要在windows计算器上算,因为我这里的例子比较特殊,除数正好可以被抵消。)
其实我这里要说的是,ios本身也提供了一个类NSDecimalNumber,这个类跟java的BigDecimal类似,也能做高精度浮点数运算,只是写起来稍稍麻烦了点。
double investmentEarnings = plan.investAmount.doubleValue*plan.yearRate.doubleValue*days*plan.typeTerm.integerValue/(12*closeDays);
改进之后
NSDecimalNumber* decInvestmentEarnings = [[[[decInvestAmount decimalNumberByMultiplyingBy:decYearRate] decimalNumberByMultiplyingBy:decDays] decimalNumberByMultiplyingBy:decTypeTerm] decimalNumberByDividingBy:[decMonths decimalNumberByMultiplyingBy:decCloseDays]];
这点跟Java的BigDecimal类似,要用其提供的加减乘除来运算,否则就会导致精度丢失的问题。
相关文章推荐
- 苹果开发者账号的种类
- iOS6、7、8、9新特性汇总和适配说明
- apns原生推送,收不到通知的问题解决
- ios 内存管理机制
- iOS开发技巧(系列十六:国际化Localization)
- ios 循环引用的场景
- ios事件之触摸事件
- IOS自动捕获程序崩溃日志再发送邮件提示开发者
- IOS Block-Block块的使用与理解
- iOS 用钥匙串存储设备唯一标识符
- forin遍历,解决Collection <__NSArrayM: 0x7ffa5261aa70> was mutated while being enumerated崩溃的问题
- iOS 设计模式之工厂模式
- iOS自动生成图片@1x,@2x ,@3x图片
- iOS开发~CocoaPods使用详细说明
- iOS
- ios 指定返回的跳转页面
- iOS纯代码开发和xib开发
- iOS conformsToProtocol
- iOS 去掉tableViewCell 点击效果 三个简单方法
- iOS 内存问题