金额计算精度问题

首先我抛出一个例子代码如下
NSString *str = @"555448.96";
    float vlue = str.floatValue;
    double vlue2 = str.doubleValue;
    NSString *rmb = [NSString stringWithFormat:@"%.2f",vlue];
    NSString *rmbeee = [NSString stringWithFormat:@"%.2f",vlue2];
    NSString *rmb1 = [NSString stringWithFormat:@"%.2f",0.123];
    NSString *rmb2 = [NSString stringWithFormat:@"%.2f",0.124];

    NSString *rmb3 = [NSString stringWithFormat:@"%.2f",0.1251];

    NSString *rmb4 = [NSString stringWithFormat:@"%.2f",0.126];

    NSString *rmb5 = [NSString stringWithFormat:@"%.2f",0.127];

结果

我们发现vlue的精度不够,如果用于银行结算会出大问题,同样float和double都是不能使用的

在OC中对于高精度的计算我们有三种方法

  • 使用floatdouble在输出时进行舍入
  • 使用longint定制小数点以及输出转换
  • 使用系统提供的建议类型NSDecimalNumber

NSDecimalNumber的使用方法有

  //由字符串进行初始化
    NSDecimalNumber * a = [NSDecimalNumber decimalNumberWithString:@"555448.96"];
    // 由unsigned long long类型进行初始化,exponent为位数,isNegative为是否为负数.
    NSDecimalNumber* b= [NSDecimalNumber decimalNumberWithMantissa:234445460 exponent:-4 isNegative:NO];
    //加减乘除操作:
    a = [a decimalNumberByAdding:b];
    a = [a decimalNumberBySubtracting:b];//减为 a-b
    a = [a decimalNumberByMultiplyingBy:b];
    a = [a decimalNumberByDividingBy:b];//除为 a / b
    // n次 幂操作
    a = [a decimalNumberByRaisingToPower:2];
    //比较操作,返回一个NSComparisonResult类型的枚举,即以-1为小于,1为大于,0为相等.
    typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1, NSOrderedSame, NSOrderedDescending}result;
    
    NSLog(@"%ld",(long)[a compare:b]);
    [a compare:b]; //进行比较.需要注意的是,compare函数的参数是 NSNumber,所以,要比较其他数值也就比较简单,如要与基础类型进行比较:
    [a compare: @1];//NSNumber可以用@进行初始化.

所以在进行金额计算时尽量避免使用 floatdouble,若要使用一定要精确计算




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值