189 8069 5689

ios开发技术博客,iOS开发论坛

iOS开发:Objective-C精确的货币计算

本文转自: iOS开发:Objective-C精确的货币计算 - ArthurChen - 51CTO技术博客

创新互联专注于乌拉特前企业网站建设,响应式网站开发,商城网站开发。乌拉特前网站建设公司,为乌拉特前等地区提供建站服务。全流程按需定制,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务

iOS开发中有时需要我们精度的严格处理,比如关于用户资金的数目处理,比较好的建议是服务端直接返回金额数目为字符串类型,这样客户端就不用担心精度显示了,如果我们需要对服务端返回过来的数据进行操作,比如:服务端两个数字float a = 0.01, int b = 99999999,两数相乘的结果是999999.99,就需要考虑精度的问题了。再比如对 flat a = 123456789.12,int b = 10000,两数相除

在iOS开发中,和货币价格计算相关的,需要注意计算精度的问题。即使只是两位小数,也会出现误差。使用float类型运算,是完全不够的。经过一番测试,最后选择使用系统提供的API的NSDecimalNumber来进行更好的解决。

作为一个对外的库,鉴于版本延续,我们保留对外的flaot的类型,不改变接口,选择进行内部适配。

以下是一些基本的测试,

原始数据

floata =0.01;

intb =99999999;

doublec =0.0;

1:使用浮点运算,

c = a*b;

NSLog(@"%f",c);

NSLog(@"%.2f",c);

使用double类型存储没有触及问题的实质,完全不能解决。

2011-12-30 11:04:00.121 Untitled[2912:207] 1000000.000000

2011-12-30 11:04:00.123 Untitled[2912:207] 1000000.00

2:使用类型转换,提高精度

c = a*(double)b;

NSLog(@"%f",c);

NSLog(@"%.2f",c);

Double运算的精度是提高了,可是浮点数的数值早已经出现了精度的不准确,即使存储空间足够,同样还是不准确的数值。

2011-12-30 11:04:00.123 Untitled[2912:207] 999999.967648

2011-12-30 11:04:00.124 Untitled[2912:207] 999999.97

3:通过和NSString的转换,将计算的原始数据转换为纯粹的double类型的数据,这样的计算精度就可以达到要求了。

NSString*objA = [NSStringstringWithFormat:@"%.2f", a];

NSString*objB = [NSStringstringWithFormat:@"%.2f", (double)b];

c = [objAdoubleValue] * [objBdoubleValue];

NSLog(@"%.2f",c);

计算的结果还是比较准确的,不过需要做格式化输入和格式化输出的处理。同时使用NSString来转换,这样的写法看起来比较奇怪。

2011-12-30 11:04:00.190 Untitled[2912:207] 999999.99

4:个人还是比较喜欢使用系统提供的类型来进行计算。通过NSDecimalNumber提供的计算方式,可以很好的计算出准确的精度的数据,同时不需要使用格式化输出等。

其计算的精度是比较高,这是官方建议的货币计算的API,对乘除等计算都有单独的API接口来提供。

NSString *decimalNumberMutiplyWithString(NSString*multiplierValue,NSString*multiplicandValue)

{

NSDecimalNumber*multiplierNumber = [NSDecimalNumberdecimalNumberWithString:multiplierValue];

NSDecimalNumber*multiplicandNumber = [NSDecimalNumberdecimalNumberWithString:multiplicandValue];

NSDecimalNumber*product = [multiplicandNumberdecimalNumberByMultiplyingBy:multiplierNumber];

return[productstringValue];

}

NSLog(@"%@",decimalNumberMutiplyWithString([NSStringstringWithFormat:@"%f",a], [NSStringstringWithFormat:@"%d",b]));

2011-12-30 11:0 4:00.251 Untitled[2912:207] 999999.99

只是测试,所以接口名大致写写,名字取得比较不那么讲究,希望可以表达清楚。

总的来说,对于货币计算,应该需要注意精度的问题。同时在运算的时候,应该优先选用框架提供的API,否则,就应该使用足够精度的类型运算,同时对自己写的接口进行足够的说明,要求开发者按照规范来使用。

在自己不能保证足够准确的情况下,用适当的说明的要求来规避责任还是可以接受的。至少被人抱怨两句总比出错强。

有哪些以 iOS 开发为主题的技术博客可以推荐

唐巧建了个 iOS 开发的slack群组:iOS开发 Slack,里面有两个博客订阅的频道,中文一个,英文一个,都是已经挑选好的 Blog 订阅,不用自己重新甄选,省事有用!

另外唐巧也在维护一个 中文 iOS/Mac 开发博客列表:tangqiaoboy/iOSBlogCN · GitHub,外加 onevcat 喵神组织的 objc中国 翻译,基本涵盖了网络上优质的 iOS 中文文章了

国外:

Raywenderlich

NSHipster

Strings - objc.io issue #9

iOSDeveloperTips.com

Beginning iPhone App Development

Tuts+ Code Tutorials

Matt Gemmell

markj.net

mikeash.com: NSBlog

iOS App Dev Libraries, Controls, Tutorials, Examples and Tools

国内:

破船之家

代码手工艺人

唐巧的技术博客

iOS News

iWangKe.me

Lancy's Blog

ios开发写博客去什么地方写专业

一般技术性平台的博客你都可以去尝试在上面写,iOS是属于技术性平台里面的分支,博客的内容都是垂直性地,所以没有存在专业与否的差别,只有对平台的选择的差别。而真正显现出博客主的专业程度的,是博客主里面的内容。故介绍几个活跃度,知名度都挺高的平台,你可以去尝试着发表,成与败看自身了。

CSND: 创立于1999年,中国最大的IT社区和服务平台,主要服务于软件开发者与IT从业者,有自成一套的周全体系。

博客园:创建于2004年1月,虽然诞生于一个小城市中,却仍旧获得了不错的发展。成长过程可谓励志。后来在上海创建了自己的团队,注册用户4w+,每日访问用户15w+,有博客,小组,博问,网摘,闪存,新闻频道,知识库和期刊多种区块。

开源中国:成立于2008年8月,主攻开源技术社区,200w+会员,有开源软件库、代码分享、资讯、协作翻译、码云、众包、招聘等几大模块内容。

blogspot:被收纳于Google,是国外的网站。首身是Pyra Labs公司创建的博客网站,提供网志书写和发布服务等功能,是全球最大、最为知名的博客服务提供商。


当前名称:ios开发技术博客,iOS开发论坛
标题路径:http://jkwzsj.com/article/hodsoj.html

其他资讯