【问题标题】:How to compare decimal values如何比较十进制值
【发布时间】:2013-11-19 07:26:51
【问题描述】:


我在比较两个十进制值时遇到问题。
我有一个文本字段,其中包含 0.123456 之类的数字和包含 0.000001 的 NSNumber。
两者的最大小数位数为 6。最小值 - 0
我试过这样做:

NSNumberFormatter *decimalFormatter = [[NSNumberFormatter alloc] init];
[decimalFormatter setNumberStyle: NSNumberFormatterDecimalStyle];
[decimalFormatter setMaximumFractionDigits:6];

double sum = [[decimalFormatter numberFromString:self.summTextField.text] doubleValue];

if (self.minSum != nil) {
    if (sum < [self.minSum doubleValue]) {
        return NO;
    }
}

但我有一个问题,有时 0.123456 = 0,123455999... 或 0,123456000000...01 例如 @0.000001 doubleValue


我如何与 NSNumber 与小数部分进行比较,以确保它是正确的?


提前致谢。

【问题讨论】:

    标签: ios objective-c compare decimal


    【解决方案1】:

    为四舍五入创建小数扩展

    extension Decimal {
     func rounded(toDecimalPlace digit: Int = 2) -> Decimal {
        var initialDecimal = self
        var roundedDecimal = Decimal()
        NSDecimalRound(&roundedDecimal, &initialDecimal, digit, .plain)
        return roundedDecimal
      }
    }
    
    let value1 = Decimal(2.34999999).rounded(toDecimalPlace: 4)
    let value2 = Decimal(2.34999989).rounded(toDecimalPlace: 4)
    print(value1.isEqual(to: value2))
    

    这导致TRUE

    【讨论】:

      【解决方案2】:

      如果您担心小数部分,您可以四舍五入您的值... 像这样的:

      -(double)RoundNormal:(double) value :(int) digit
      {
          value = round(value * pow(10, digit));
          return value / pow(10, digit);
      }
      

      然后比较一下。

      【讨论】:

        【解决方案3】:

        如果你不想太麻烦,你可以简单地进行测试

        if(abs(x-y) < 0.0001)
        

        【讨论】:

          【解决方案4】:

          这应该解决它:

          NSNumberFormatter *decimalFormatter = [[NSNumberFormatter alloc] init];
          [decimalFormatter setNumberStyle: NSNumberFormatterDecimalStyle];
          [decimalFormatter setMaximumFractionDigits:6];
          [decimalFormatter setMinimumFractionDigits:6];
          [formatter setRoundingMode:NSNumberFormatterRoundHalfUp];
          [formatter setRoundingIncrement:[NSNumber numberWithDouble:0.000001]]
          

          【讨论】:

          • setMinimumFractionDigits:6。但是可能有 1 或 3,或 0。这段代码可以吗?
          【解决方案5】:

          使用 NSDecimalNumber 类 - 请参阅指南数字和值编程主题

          【讨论】:

            【解决方案6】:

            这是 NSDecimal 数字在 iOS 中的比较方式:

            if ( [x compare:y] == NSOrderedSame ){
                // If x is equal to y then your code here..
            }
            
            if([x compare:y] == NSOrderedDescending){
                // If x is descendant to y then your code here..
            }
            
            if([x compare:y] == NSOrderedAscending){
                // If x is ascendant to y then your code here.. 
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-12-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-24
              • 2021-08-26
              相关资源
              最近更新 更多