NSLog(@"%llu\n\n", ULONG_LONG_MAX);
NSDecimalNumber *decimal = [NSDecimalNumber decimalNumberWithString:@"154550038129946620"];
NSLog(@"%@", decimal);
NSLog(@"%llu\n\n", [decimal unsignedLongLongValue]);
decimal = [NSDecimalNumber decimalNumberWithString:@"154550038129946628"];
NSLog(@"%@", decimal);
NSLog(@"%llu", [decimal unsignedLongLongValue]);
两个值都小于ULONG_LONG_MAX。但是,我们在输出中看到的是:
2012-01-05 17:41:55.879 test[1276:207] 18446744073709551615
2012-01-05 17:41:55.969 test[1276:207] 154550038129946620
2012-01-05 17:41:56.095 test[1276:207] 154550038129946624
2012-01-05 17:41:56.096 test[1276:207] 154550038129946628
2012-01-05 17:41:56.096 test[1276:207] 154550038129946624
我做错了什么?我不知道如何解释这种行为。
NSDecimalNumber
范围内,你可以获得可靠的精度,这对于SDK设计者来说是最重要的。转换到其他类型只是为了方便;使用它们需要理解由于表示方式的差异可能会丢失一些精度。 - Sergey KalinichenkoNSDecimalNumber
的架构师本可以提供更直观的行为,特别是因为架构已经提供了一切他们需要使其正确的东西。他们所需要做的就是覆盖一个已经存在的方法。但这并不足以称之为根本性的问题。 - Sergey Kalinichenko