我有一个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);
如何正确进行此计算?
谢谢!
答案 0 :(得分:1)
您可以使用NSDecimalNumber类来获得最多38位数的精度。要获得mod,只需将此公式与您在文档中解释的相应NSDecimalNumber方法一起使用。
Mod = digit - int(digit/97)
这是因为NSDecimalNumber只能执行基本操作,你必须像我们在学校那样获得mod。
来自Apple文档:
答案 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