iOS:计算长数的除法余数

时间:2013-09-01 12:57:57

标签: ios

我有一个NSString *,例如以下数字@“182316110006010135232100”,我需要用这个完整的值进行计算。我在iOS SDK上尝试了多种类型的数字系统,例如Int,Float等。但是由于位数的增加,当我将StringValue更改为例如IntValue时,它会更改数字。 我需要用这个完整的值来做以下求和:mod(digit,97);

我已经检查过目前为止我知道Objective-C Long Long中最长的数字类型:

long long digit = [(NSString *)shouldBechecksum longLongValue]; 

需要进行以下计算:

mod(digit, 97);

现在我得到了奇怪的结果,因为它与数字的最大版本相加。我需要它来做这个:

mod(182316110006010135232100, 97);

如何正确进行此计算?

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用NSDecimalNumber类来获得最多38位数的精度。要获得mod,只需将此公式与您在文档中解释的相应NSDecimalNumber方法一起使用。

Mod = digit - int(digit/97)

这是因为NSDecimalNumber只能执行基本操作,你必须像我们在学校那样获得mod。

来自Apple文档:

NSDecimalNumber是NSNumber的不可变子类,它提供了一个面向对象的包装器,用于执行base-10算术。实例可以表示任何可以表示为尾数x 10 ^指数的数字,其中尾数是长度为38位的十进制整数,指数是-128到127之间的整数。

答案 1 :(得分:0)

修正了谢谢!

NSDecimalNumber *bigDecimal = [NSDecimalNumber decimalNumberWithString:shouldBechecksum];
NSDecimalNumber *divisor = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:97] decimalValue]];
NSDecimalNumber *quotient = [bigDecimal decimalNumberByDividingBy:divisor withBehavior:[NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:0 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO]];

NSDecimalNumber *subtractAmount = [quotient decimalNumberByMultiplyingBy:divisor];

NSDecimalNumber *remainder = [bigDecimal decimalNumberBySubtracting:subtractAmount];
int checkSum = 98 - [remainder intValue];

答案 2 :(得分:0)

我使用以下代码片段进行了一些测试:

NSString *digitStr = @"182316110006010135232100";

long long digit = [(NSString *)digitStr longLongValue];

short checksum = digit % 97;

NSLog(@"%@, %lli, %lli, %i", digitStr, LONG_LONG_MAX, digit, checksum);

结果是:

182316110006010135232100, 9223372036854775807, 9223372036854775807, 78

这意味着您的值会传递LONG_LONG_MAX值。所以,你的问题不可行。

备注:显然,Objective C将最接近您的数字的值放在varbel数字中,为LONG_LONG_MAX。

我想你必须为更长的数字找到某种解决方案才能做你想做的事情。也许NSDecimalNumber。

亲切的问候, PF