2012-01-05 25 views
6
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]); 

Cả hai giá trị nhỏ hơn ULONG_LONG_MAX. Nhưng, những gì chúng ta thấy ở đầu ra là:Mục tiêu C số thập phân lạ để chuyển đổi lâu dài

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 

Tôi đang làm gì sai? Tôi không có ý tưởng làm thế nào để giải thích hành vi này.

Trả lời

5

NSDecimalNumber thiếu phương pháp unsignedLongLongValue, do đó, nó kế thừa triển khai mặc định từ NSNumber. Cách duy nhất để nhận giá trị NSDecimalNumber đang nhận được cấu trúc NSDecimal hoặc double. Lỗi chuyển đổi được giới thiệu trong quá trình chuyển đổi NSDecimalNumber thành double.

+0

Tôi đã không nhận được nó từ đầu và đăng câu trả lời của riêng tôi, nhưng bây giờ tôi nhận được nó, và câu trả lời của bạn là bằng của tôi. Đối với những người khác, những người, giống như tôi, đã không hoàn toàn hiểu - số thập phân bên trong 'NSDecimalNumber' được đúc thành gấp đôi trước khi truyền tới unsigned long long. Dù sao, tôi nghĩ đó là lỗi SDK cơ bản. –

+0

@AlexanderN. Tôi không đồng ý rằng đây là một thiếu sót cơ bản của SDK: nếu bạn ở trong 'NSDecimalNumber's, bạn sẽ có được độ chính xác vững chắc, đó là tất cả những gì quan trọng đối với các nhà thiết kế của SDK. Chuyển đổi sang các loại khác chỉ có sự tiện lợi; sử dụng của họ đi kèm với sự hiểu biết rằng một số độ chính xác có thể bị mất do sự khác biệt trong biểu diễn. – dasblinkenlight

+0

Tôi đã từ bỏ nó. Nhưng bạn không nghĩ rằng đó là một chút lạ - cast số nguyên (trong trường hợp này) thập phân đến số nguyên dài dài và mất độ chính xác, như trong đúc nổi-int? –

Các vấn đề liên quan