您的位置:首页 > 移动开发 > IOS开发

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类似,要用其提供的加减乘除来运算,否则就会导致精度丢失的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: