iOS 金融数字 (NSDecimalNumber)

 

后台返回的金额数是字符串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(@"大于");

}

 

   

   

转载于:https://my.oschina.net/u/2472425/blog/881309

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值