美文网首页
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