今天就跟大家聊聊有关iOSNSDecimalNumber中的小数该怎样精确计算,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
创新互联是由多位在大型网络公司、广告设计公司的优秀设计人员和策划人员组成的一个具有丰富经验的团队,其中包括网站策划、网页美工、网站程序员、网页设计师、平面广告设计师、网络营销人员及形象策划。承接:做网站、网站设计、网站改版、网页设计制作、网站建设与维护、网络推广、数据库开发,以高性价比制作企业网站、行业门户平台等全方位的服务。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
看完上述内容,你们对iOSNSDecimalNumber中的小数该怎样精确计算有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联网站建设公司行业资讯频道,感谢大家的支持。
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。