美文网首页
NSDecimalNumber 四则运算

NSDecimalNumber 四则运算

作者: Geniune | 来源:发表于2019-03-19 16:50 被阅读0次

    后台返回97.70,若使用float类型接收时,就会发现数据精度发生了改变,iOS客户端收到了“97.6999999...”,解决办法:使用NSString类型接收

    使用float类型进行四则计算时,也会出现类似问题,解决方法是:所有参与运算的数据均使用NSString类型,并且在对其进行计算的时候使用NSDecimalNumber

    1. 加法
    NSString *decimalNumbeAdding(NSString *value1, NSString *value2)
    {
        NSDecimalNumber *multiplierNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", value1]];
        NSDecimalNumber *multiplicandNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", value2]];
        NSDecimalNumber *product = [multiplierNumber decimalNumberByAdding:multiplicandNumber];
        return [product stringValue];
    }
    
    1. 减法
    NSString *decimalNumbeSubtracting(NSString *value1,NSString *value2)
    {
        NSDecimalNumber *multiplierNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", value1]];
        NSDecimalNumber *multiplicandNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", value2]];
        NSDecimalNumber *product = [multiplierNumber decimalNumberBySubtracting:multiplicandNumber];
        return [product stringValue];
    }
    
    1. 乘法
    NSString *decimalNumberMutiply(NSString *value1,NSString *value2)
    {
        NSDecimalNumber *multiplierNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", value1]];
        NSDecimalNumber *multiplicandNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", value2]];
        NSDecimalNumber *product = [multiplierNumber decimalNumberByMultiplyingBy:multiplicandNumber];
        return [product stringValue];
    }
    
    1. 除法
    NSString *decimalNumberDividing(NSString *value1,NSString *value2)
    {
        if(StrIsEmpty(value1) || StrIsEmpty(value2) || [value1 floatValue] == 0.00f || [value2 floatValue] == 0.00f){
            return @"0.00";
        }
        NSDecimalNumber *multiplierNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", value1]];
        NSDecimalNumber *multiplicandNumber = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%@", value2]];
        NSDecimalNumber *product = [multiplierNumber decimalNumberByDividingBy:multiplicandNumber];
        return [product stringValue];
    }
    

    使用示例

    //金额 = 数量 * 单价
    NSString *amount = decimalNumberMutiply(quantity, price);
    

    注意:算出的结果并不会自动保留两位小数,如99.99 * 99.99 = 9998.0001,如需保留两位小数可以使用NSDecimalNumberHandler

    /**
     初始化方法
    
     @param roundingMode 舍入方式
     @param scale 小数点后舍入值的位数。
     @param exact 精度错误处理;YES:如果出现错误,将引发异常,NO:忽略错误并将控制权放回给调用者。
     @param overflow 溢出错误处理;YES:如果出现错误,将引发异常,NO:忽略错误并将控制权放回给调用者。
     @param underflow 下溢错误处理;YES:如果出现错误,将引发异常,NO:忽略错误并将控制权放回给调用者。
     @param divideByZero 除以0的错误处理;YES:如果出现错误,将引发异常,NO:忽略错误并将控制权放回给调用者。
     @return NSDecimalNumberHandler对象
     */
    + (instancetype)decimalNumberHandlerWithRoundingMode:(NSRoundingMode)roundingMode
                                                   scale:(short)scale
                                        raiseOnExactness:(BOOL)exact
                                         raiseOnOverflow:(BOOL)overflow
                                        raiseOnUnderflow:(BOOL)underflow
                                     raiseOnDivideByZero:(BOOL)divideByZero
    

    相关文章

      网友评论

          本文标题:NSDecimalNumber 四则运算

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