文档章节

iOS 金融数字 (NSDecimalNumber)

 王素年
发布于 2017/04/17 22:20
字数 574
阅读 217
收藏 0

 

后台返回的金额数是字符串NSString,要对其进行计算的话,当时就转成CGFloat,结果发现转后的数值不准确了,解决这个问题需要使用金融货币的API。

 

//部分创建方法

NSDecimalNumber *FloatDN = [[NSDecimalNumber alloc] initWithFloat:1.0998];//结果是:1.0997999906539917312

NSDecimalNumber *IntDN =[[NSDecimalNumber alloc]initWithInt:2];   //结果是:2

NSDecimalNumber *IntegerDN =[[NSDecimalNumber alloc]initWithInteger:2];   //结果是:2

NSDecimalNumber *BoolDN =[[NSDecimalNumber alloc]initWithBool:0];  //结果是:0

NSDecimalNumber *zeroDN = [NSDecimalNumber zero]; // 结果是:0

NSDecimalNumber *oneDN  = [NSDecimalNumber one];  // 结果是:1

 

NSNumber -> NSDecimalNumber(基础类型的话,要先转成NSNumber)

NSDecimalNumber *num2 = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithInt:123.98] decimalValue]]; //结果是:123

NSDecimalNumber *num3 = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:123.01298] decimalValue]];//结果是:123.01298

   

NSString -> NSDecimalNumber

NSDecimalNumber *a = [NSDecimalNumber decimalNumberWithString:@"1.0998"];

NSDecimalNumber *b = [NSDecimalNumber decimalNumberWithString:@"0.9934"];

NSDecimalNumber *result1 = [a decimalNumberByAdding:b];   加

NSDecimalNumber *result2 = [a decimalNumberBySubtracting:b]; 减

NSDecimalNumber *result3 = [a decimalNumberByMultiplyingBy:b]; 乘

NSDecimalNumber *result4 = [a decimalNumberByDividingBy:b]; 除数为0会 crash

 

 

 

NSDecimalNumberHandler

    NSRoundPlain    四舍五入

    NSRoundDown   只舍不入

    NSRoundUp,      只入不舍

    NSRoundBankers  四舍六入, 中间值时, 取最近的,保持保留最后一位为偶数

    scale: 小数点后保留的位数

NSDecimalNumberHandler *roundUp = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];

NSDecimalNumber *one = [NSDecimalNumber decimalNumberWithString:@"90.7009"];

NSDecimalNumber *two = [NSDecimalNumber decimalNumberWithString:@"0.22"];

   
//1. one + two 不做任何处理

NSDecimalNumber *result1 = [one decimalNumberByAdding:two];

   
//2. one - two 不做任何处理

NSDecimalNumber *result2 = [one decimalNumberBySubtracting:two];


//3. one * two 不做任何处理

NSDecimalNumber *result3 = [one decimalNumberByMultiplyingBy:two];


//4. one + two 结果 四舍五入

NSDecimalNumber *result4 = [one decimalNumberByAdding:two withBehavior:roundUp];


//5.对一个数 进行四舍五入,并保留2位小数的操作

NSDecimalNumber *resultDN = [one decimalNumberByRoundingAccordingToBehavior: roundUp];

  

 

 

 

 

 

 

对于服务器返回可计算的 Float 或者 Double 或者 int,但是计算完后,用什么接受呢?float? double?这样精度还是不精确

float A = 0.01;

float B = 9999.01;

   

float C = A*B;               //我们日常手动计算结果应该是 99.9901

NSLog(@"CCCCC==%f",C);     //输出结果为 99.990097

NSLog(@"CCCCC==%.2f",C);   //保留两位小数,输出结果为 99.99(自动4舍5入)

               明显不精确了,我们想要的是99.9901

用上面的方法解决,代码如下:

NSDecimalNumber *multiplierNumber = [NSDecimalNumber decimalNumberWithString:@"0.01"];

NSDecimalNumber *multiplicandNumber = [NSDecimalNumber decimalNumberWithString:@"9999.01"];

NSDecimalNumber *product = [multiplicandNumber decimalNumberByMultiplyingBy:multiplierNumber];

NSString *productStr =  [product stringValue]; //转成字符串方便显示(转成字符串的过程中不会出现精度问题,放心)

  productStr 就是  @"99.9901"

   

 

 

比较大小       

NSDecimalNumber *discount1 = [NSDecimalNumber decimalNumberWithString:@".85"];

NSDecimalNumber *discount2 = [NSDecimalNumber decimalNumberWithString:@".9"];

NSComparisonResult result = [discount1 compare:discount2];

   
if (result == NSOrderedAscending) {

       NSLog(@"小于");

} else if (result == NSOrderedSame) {

       NSLog(@"等于");

} else if (result == NSOrderedDescending) {

       NSLog(@"大于");

}

 

   

   

© 著作权归作者所有

粉丝 2
博文 72
码字总数 44909
作品 0
普陀
程序员
私信 提问
iOS In-App Purchase中涉及到的货币单位

iOS In-App Purchase中涉及到的货币单位 发表于 2014 年 2 月 18 日 由 三石 现在iOS的AppStore上各类应用非常丰富,有付费的也有免费的,而免费的应用也可以支持IAP (In-App Purchase,应用...

壹峰
2018/12/09
296
0
iOS开发NSDecimalNumber的基本使用,加、减、乘、除、指数、比较

在iOS开发中,经常遇到和货币价格计算相关的,这时就需要注意计算精度的问题。使用float类型运算,经常出现误差。为了解决这种问题我们使用NSDecimalNumber,下面将通过例子的形式给大家展示...

坤宇
03/27
0
0
iOS 7 在 iPhone 中的市占率增长至 89.7%

据国外媒体报道,随着苹果全球开发者大会即将召开,一家市场研究公司称,iOS 7市占率在美国和加拿大增长至新水平。在备受期待的iOS 8发布之前,iPhone和iPad用户继续向iOS 7升级,iOS 7在北美...

oschina
2014/06/01
1K
11
ios时间那点事--NSLocale

iOS时间那点事 NSLocale 若你只开发中国区的应用,需要保证用户修改当前语言环境时应用的显示不发生变化。而像NSDateFormatter这样的类,会根据设备的设置,自动返回不同语言的数据。为了保证...

JustBen
2013/08/22
6.5K
0
蚂蚁金服客户端招聘---求简历

职位描述 理财类金融产品应用(Android/IOS版本)的架构设计和开发工作; 根据产品需求开发相关feature,配合市场等其他部门,提供产品相关技术支持; 研究新技术、新架构,并能应用和推广到产...

LooperJing
04/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Taro 兼容 h5 踩坑指南

最近一周在做 Taro 适配 h5 端,过程中改改补补,好不酸爽。 本文记录📝遇到的问题,希望为有相同需求的哥们👬节约点时间。 Taro 版本:1.3.9。 解决跨域问题 h5 发请求会报跨域问题,需...

dkvirus
49分钟前
3
0
Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
今天
2
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
今天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
今天
19
0
java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部