ios 浮点数精度问题

本人是在金融类公司工作,经常涉及到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类似,要用其提供的加减乘除来运算,否则就会导致精度丢失的问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值