如何比较小数值

时间:2013-11-19 07:26:52

标签: ios objective-c compare decimal


比较两个十进制值我有问题 我有一个文本字段,其中包含数字,如0.123456和NSNumber包含0.000001。  
两者的最大分数为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&lt; @ 0.000001 doubleValue - TRUE。


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


提前致谢。

6 个答案:

答案 0 :(得分:0)

如果您不想打扰,可以简单地进行测试

if(abs(x-y) < 0.0001)

答案 1 :(得分:0)

这应解决它:

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

答案 2 :(得分:0)

如果您担心分数部分,您可以围绕您的价值... 像这样:

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

然后比较它。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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.. 
}

答案 5 :(得分:0)

创建十进制扩展名以进行四舍五入

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