本篇文章主要介绍了浅谈iOS 关于小数精确计算(NSDecimalNumber),具有一定的参考价值,有兴趣的可以了解一下
做了好一段时间的金融产品,对数字是要非常敏感,差个零点零几都不行,精确度是要非常重视的,将后台传给我的floatValue转成NSString,一直没发现问题,最近项目有关个人账户的资产显示,发现总是和web和android有点误差,百思不得其解,在Stack Overflow上面问了一下,发现了NSDecimalNumber这个API,这个类为OC程序提供定点算法功能,它被设计不会损失精度并且可预先设置凑整规则的10进制计算,它比浮点数更好去表达货币,作为代价,它的计算相对复杂,相对耗时。
举个栗子:
float a = 0.01;
int b = 99999999;
double c = 0.0;
c = a * b;
NSLog(@"%f",c);
NSLog(@"%.2f",c);
2017-08-02 15:41:25.620 DecimalNumber[3014:155231] 1000000.000000
2017-08-02 15:41:25.620 DecimalNumber[3014:155231] 1000000.00
明显已经已经失真了。
那么我们换个类型,把精度调高,会不会好点呢?
c = a*(double)b;
NSLog(@"%f",c);
NSLog(@"%.2f",c);
然并卵,
2017-08-02 16:16:32.293 DecimalNumber[3144:167125] 999999.967648
2017-08-02 16:16:32.294 DecimalNumber[3144:167125] 999999.97
这都是什么鬼,数学白学了。
最后想到了一个方法,我把它转成了字符串,然后再转成double类型,没想到精度就达到要求了
NSString *aString = [NSString stringWithFormat:@"%.2f", a];
NSString *bSting = [NSString stringWithFormat:@"%.2f", (double)b];
c = [aString doubleValue] * [bString doubleValue];
NSLog(@"%.2f",c);
2017-08-02 16:27:32.590 DecimalNumber[3252:172900] 999999.99
不过看起来有点别扭,转过来转过去的就不说了,一看感觉感觉不专业。下面通过NSDecimalNumber提供计算方式,这是官方建议的货币计算API,精确度比较高,对乘除计算都有单独的接口提供。
NSDecimalNumber *decimalNumber1 = [NSDecimalNumber decimalNumberWithString:aString];
NSDecimalNumber *decimalNumber2 = [NSDecimalNumber decimalNumberWithString:bString];
NSDecimalNumber *result = [decimalNumber1 decimalNumberByMultiplyingBy:decimalNumber2];
NSLog(@"%@",result);
2017-08-02 16:35:32.779 DecimalNumber[3369:177485] 999999.99
这样看起来就舒服多了,精确度也得到了满足
在对于货币的计算显示,要时刻注意精度的问题。优先选用此API,下面是官方的说明NSDecimalNumber
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程学习网。
本文标题为:浅谈iOS 关于小数精确计算(NSDecimalNumber)
基础教程推荐
- Android开发使用RecyclerView添加点击事件实例详解 2023-06-15
- iOS开发教程之XLForm的基本使用方法 2023-05-01
- Android中的webview监听每次URL变化实例 2023-01-23
- Flutter手势密码的实现示例(附demo) 2023-04-11
- Flutter绘图组件之CustomPaint使用详解 2023-05-12
- IOS 播放系统提示音使用总结(AudioToolbox) 2023-03-01
- android studio按钮监听的5种方法实例详解 2023-01-12
- IOS应用内跳转系统设置相关界面的方法 2022-11-20
- Android多返回栈技术 2023-04-15
- 解决Android Studio突然不显示logcat日志的问题 2023-02-04
