浅谈iOS 关于小数精确计算(NSDecimalNumber)

所属分类: 软件编程 / IOS 阅读数: 179
收藏 0 赞 0 分享

做了好一段时间的金融产品,对数字是要非常敏感,差个零点零几都不行,精确度是要非常重视的,将后台传给我的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 使用Block二次封装AFNetworking 3.0详解

这篇文章主要介绍了IOS 使用Block二次封装AFNetworking 3.0详解的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

IOS 开发之对象为空的判断(nil、null)详解

这篇文章主要介绍了IOS 开发之对象为空的判断(nil、null)详解的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

iOS创建对象的不同姿势详解

这篇文章主要介绍了iOS创建对象的不同姿势,文中介绍的很详细,对大家具有一定的参考价值,有需要的朋友们下面来一起学习学习吧。
收藏 0 赞 0 分享

探究iOS多线程究竟不安全在哪里?

iOS多线程安全的概念在很多地方都会遇到,为什么不安全,不安全又该怎么去定义,其实是个值得深究的话题。那么通过下面这篇文章小编和大家一起来探究了iOS多线程究竟不安全在哪里?需要的朋友可以参考学习。
收藏 0 赞 0 分享

IOS购物车界面实现效果示例

本篇文章主要介绍了IOS购物车界面实现效果示例,有需要了解的朋友可参考。希望此文章对各位有所帮助。
收藏 0 赞 0 分享

iOS Touch ID 身份认证

本文主要介绍了iOS Touch ID 身份认证的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
收藏 0 赞 0 分享

iOS 使用 socket 实现即时通信示例(非第三方库)

这篇文章主要介绍了iOS 使用 socket 即时通信示例(非第三方库)的资料,这里整理了详细的代码,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

ios常见加密解密方法(RSA、DES 、AES、MD5)

本篇文章主要介绍了ios常见加密解密方法(RSA、DES 、AES、MD5),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

iOS利用AFNetworking实现文件上传的示例代码

本篇文章主要介绍了iOS利用AFNetworking实现文件上传的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

浅谈IOS中AFNetworking网络请求的get和post步骤

本篇文章主要介绍了浅谈IOS中AFNetworking网络请求的get和post步骤的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
收藏 0 赞 0 分享
查看更多