Iphone 检查NSDecimalNumber是否为整数

Iphone 检查NSDecimalNumber是否为整数,iphone,objective-c,ios,nsdecimalnumber,Iphone,Objective C,Ios,Nsdecimalnumber,检查NSDecimalNumber实例是否为整数的最简单方法是什么 谢谢 试试这个,你可以跳过第一行,我刚刚用它创建了一个NSDecimalNumber对象 NSDecimalNumber *decNumb=[NSDecimalNumber decimalNumberWithString:@"20.5"];//try with just 20 NSString* str=[NSString stringWithFormat:@"%@",decNumb]; if ([str rangeOfSt

检查
NSDecimalNumber
实例是否为整数的最简单方法是什么


谢谢

试试这个,你可以跳过第一行,我刚刚用它创建了一个NSDecimalNumber对象

NSDecimalNumber  *decNumb=[NSDecimalNumber decimalNumberWithString:@"20.5"];//try with just 20
NSString* str=[NSString stringWithFormat:@"%@",decNumb];

if ([str rangeOfString:@"."].location==NSNotFound && [str rangeOfString:@"-"].location==NSNotFound) {
    NSLog(@"it is whole number");
} 
else
    NSLog(@"it is not whole number");

从十进制数中减去整数。如果差值为零,则十进制数为整数

// testVal is NSDecimalNumber
NSString *test = [testVal stringValue];
int intVal = [test intValue];
double doubleVal = [test doubleValue];
if(doubleVal-intVal == 0){
    NSLog(@"Whole number!");
}
或者,获取整数并与原始值进行比较:

if(intVal == doubleVal){
    NSLog(@"Whole number!");
}
是否可以不使用if((数字%1)==0)

@NSDecimalNumber(isWholeNumber)
-(BOOL)是整数吗
{
double x=[self doubleValue];//作为双精度的接收器的近似值。
双y=地板(x);
if(fabs(x-y)
这应该行得通

小心使用将
NSDecimalNumber
转换为
double
的方法

NSDecimalNumber* input = [...];

NSDecimal roundedDecimal;
NSDecimalRound(&roundedDecimal, [input decimalValue], 0, NSRoundPlain);

NSDecimalNumber* roundedNumber = [NSDecimalNumber decimalNumberWithDecimal:roundedDecimal];

BOOL inputIsWholeNumber = [input isEqualToNumber:roundedNumber];

您还应该检查
NaN
值。

不确定原因,但由于某种原因,我无法让Jody Hagins或Sulthan的解决方案发挥作用,因此我选择了稍微不同的方式:

@interface NSDecimalNumber (IsIntegerNumber)
@property (readonly) BOOL isIntegerNumber;
@end

@implementation NSDecimalNumber (IsIntegerNumber)
-(BOOL)isIntegerNumber {
    NSDecimalValue value = [self decimalValue];
    if (NSDecimalIsNotANumber(&value)) return NO;
    NSDecimal rounded;
    NSDecimalRound(&rounded, &value, 0, NSRoundPlain);
    return NSDecimalCompare(&rounded, &value) == NSOrderedSame;
}
@end
-(BOOL)isWholeNumber:(NSDecimalNumber *)number {
    NSDecimalNumber *input = number;

    NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain
                                                                                             scale:0
                                                                                  raiseOnExactness:NO
                                                                                   raiseOnOverflow:NO
                                                                                  raiseOnUnderflow:NO
                                                                               raiseOnDivideByZero:NO];

    NSDecimalNumber *vOne = [NSDecimalNumber decimalNumberWithString:@"1"];

    NSDecimalNumber *result = [number decimalNumberByMultiplyingBy:vOne
                                                      withBehavior:handler];

    BOOL inputIsWholeNumber = [input isEqualToNumber:result];

    return inputIsWholeNumber;
}


我不确定。如果([myDecNumber isEqualToNumber:[myDecNumber integerValue]])
呢?只需将十进制值转换为int并检查其是否相同,可能是这样的:
如果([myDecimalNumber decimalValue]/1.0)>0{}
?对于本地化来说不是很好。如果数字是“2.0”,NSDecimalNumber会自动将20.0转换为20。请自行检查。您可以通过将2.0分配给decNumb来检查上述代码。不知何故,NSDecimalNumber似乎将2.0标准化为2。是的,它这样做了,但这是未记录的行为。我提交了答案的编辑,并将一个“double”改为“int”。不过,我认为原始版本也可以。抱歉打扰您。任何使用
double
的方法都不能与
NSDecimalNumber
一起使用。如果数字有30位呢?这是最简单的解决方案!你会失去准确性
double
无法覆盖
NSDecimalNumber
中的所有值。我的印象是,将
NSDecimalNumber
转换为
double
float
时,会损失一点点精度。我可能误解了这一点,但我很好奇,如果情况确实如此,这种方法的结果是否会受到影响。谢谢。@Sulthan是的,因为double是base-2,而NSDecimalNumber是base-10。@James base-10到base-2的转换造成的损失很重要,但重要的是,
NSDecimalNumber
最多可以容纳38位小数,而
double
只能容纳16位小数!我还没有机会测试它,但这似乎是我正在寻找的解决方案。谢谢你。@James也可以查看Jody Hagins的答案。他/她在接受你的答案后立即提交。我对这两个问题都投了赞成票,但我认为将被接受的答案改成他/她的答案可能对其他寻求快速答案的人更有帮助。希望你不介意。
-(BOOL)isWholeNumber:(NSDecimalNumber *)number {
    NSDecimalNumber *input = number;

    NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain
                                                                                             scale:0
                                                                                  raiseOnExactness:NO
                                                                                   raiseOnOverflow:NO
                                                                                  raiseOnUnderflow:NO
                                                                               raiseOnDivideByZero:NO];

    NSDecimalNumber *vOne = [NSDecimalNumber decimalNumberWithString:@"1"];

    NSDecimalNumber *result = [number decimalNumberByMultiplyingBy:vOne
                                                      withBehavior:handler];

    BOOL inputIsWholeNumber = [input isEqualToNumber:result];

    return inputIsWholeNumber;
}