NSDecimalNumber为长数字

时间:2010-09-16 13:30:00

标签: numbers nsnumberformatter nsdecimalnumber

我正在尝试让NSDecimalNumber打印出大数字,15位或更多位数。在15位数我看到111,111,111,111,111。超过15位数我看到1,111,111,111,111,110,即使格式化的数字是1111111111111111。

说明我的问题的一个例子:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMaximumSignificantDigits:25];
[formatter setUsesSignificantDigits:true];

NSDecimalNumber* test = [NSDecimalNumber decimalNumberWithString:@"12345678901234567890"];

NSString* output = [formatter stringFromNumber:test]; 
NSLog( @"num value: %@", test ); 
NSLog( @"str value: %@", output );

输出如下:

2010-09-16 09:24:16.783 SimpleCalc[739:207] num value: 12345678901234567890
2010-09-16 09:24:16.784 SimpleCalc[739:207] str value: 12,345,678,901,234,600,000

我错过了什么愚蠢的事情?

2 个答案:

答案 0 :(得分:3)

此处的问题是NSNumberFormatter内部无法处理NSDecimalNumbers,它们会转换为double,您会看到由此导致的精度损失。来自文档:

  

表示包含整数,浮点数和双精度数;浮点数和双精度数可以格式化为指定的小数位。

您可能应该查看- (NSString *)descriptionWithLocale:(NSDictionary *)locale上的NSDecimalNumber方法。

答案 1 :(得分:0)

NSDecimalString()。带上NSDecimalNumber(例如myDecimalNumber),通过NSDecimaldecimalValue)提取NSDecimal decimal = [myDecimalNumber decimalValue]并使用{{1}创建NSString功能。

https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/index.html#//apple_ref/c/func/NSDecimalString