美文网首页
iOS 金融数字 (NSDecimalNumber)

iOS 金融数字 (NSDecimalNumber)

作者: 就用帅气点的昵称吧 | 来源:发表于2019-05-07 17:56 被阅读0次

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

//部分创建方法

NSDecimalNumber*FloatDN = [[NSDecimalNumberalloc] initWithFloat:1.0998];//结果是:1.0997999906539917312NSDecimalNumber*IntDN =[[NSDecimalNumberalloc]initWithInt:2];//结果是:2NSDecimalNumber*IntegerDN =[[NSDecimalNumberalloc]initWithInteger:2];//结果是:2NSDecimalNumber*BoolDN =[[NSDecimalNumberalloc]initWithBool:0];//结果是:0NSDecimalNumber*zeroDN = [NSDecimalNumberzero];// 结果是:0NSDecimalNumber*oneDN  = [NSDecimalNumberone];// 结果是:1

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

NSDecimalNumber*num2 = [NSDecimalNumberdecimalNumberWithDecimal:[[NSNumbernumberWithInt:123.98] decimalValue]];//结果是:123NSDecimalNumber*num3 = [NSDecimalNumberdecimalNumberWithDecimal:[[NSNumbernumberWithDouble:123.01298] decimalValue]];//结果是:123.01298

NSString -> NSDecimalNumber

NSDecimalNumber*a = [NSDecimalNumberdecimalNumberWithString:@"1.0998"];NSDecimalNumber*b = [NSDecimalNumberdecimalNumberWithString:@"0.9934"];NSDecimalNumber*result1 = [a decimalNumberByAdding:b];   加NSDecimalNumber*result2 = [a decimalNumberBySubtracting:b]; 减NSDecimalNumber*result3 = [a decimalNumberByMultiplyingBy:b]; 乘NSDecimalNumber*result4 = [a decimalNumberByDividingBy:b]; 除数为0会 crash

NSDecimalNumberHandle

    NSRoundPlain    四舍五入

    NSRoundDown   只舍不入

    NSRoundUp,      只入不舍

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

    scale: 小数点后保留的位数

    /*

    NSRoundPlain    四舍五入

    NSRoundDown  只舍不入

    NSRoundUp,      只入不舍

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

     初始化方法

     @param roundingMode 舍入方式

     @param scale 小数点后舍入值的位数

     @param exact 精度错误处理

     @param overflow 溢出错误处理

     @param underflow 下溢错误处理

     @param divideByZero 除以0的错误处理

    @return NSDecimalNumberHandler对象

     */

    NSDecimalNumberHandler *roundUp = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain

                                                                                             scale:2// 小数点后保留的位数

                                                                                  raiseOnExactness:NOraiseOnOverflow: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 = [NSDecimalNumberdecimalNumberWithString:@"0.01"];

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

NSDecimalNumber*product = [multiplicandNumber decimalNumberByMultiplyingBy:multiplierNumber];

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

  productStr 就是  @"99.9901"

比较大小

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

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

NSComparisonResultresult = [discount1 compare:discount2];

if(result ==NSOrderedAscending) {

NSLog(@"小于");

}elseif(result ==NSOrderedSame) {

NSLog(@"等于");

}elseif(result ==NSOrderedDescending) 

NSLog(@"大于");

}

相关文章

网友评论

      本文标题:iOS 金融数字 (NSDecimalNumber)

      本文链接:https://www.haomeiwen.com/subject/mfyyoqtx.html