2010-09-01 23 views
5

Tôi đang cố chuyển đổi đối tượng NSString thành một NSNumber có cùng giá trị số. Khi tôi tạo ra các đối tượng NSString sử dụng tuyên bố này ...Tại sao lớp NSNumber không chính xác chuyển đổi đối tượng NSString của tôi thành một thời gian dài?

NSString *songID = [localNotif.userInfo objectForKey:@"SongID"]; 

var songID chứa chuỗi giá trị @"10359537395704663785". và khi tôi cố gắng để chuyển nó sang một đối tượng NSNumber sử dụng câu lệnh ...

NSNumber *songIDNumber = [NSNumber numberWithLongLong:[songID longLongValue]]; 

var songIDNumber chứa các giá trị sai của 9223372036854775807

Tôi đang làm gì sai? Cũng cần lưu ý rằng đôi khi mã này hoạt động và tạo ra giá trị đúng của NSNumber, nhưng phần lớn thời gian không thành công như được hiển thị ở trên.

Cảm ơn trước sự giúp đỡ của bạn!

CẬP NHẬT: Thiên Chúa Tôi yêu trang web này! Nhờ unbeli và carl, tôi đã có thể sửa chữa nó sử dụng mã được cập nhật để chuyển đổi từ NSString đến NSNumber ...

unsigned long long ullvalue = strtoull([songID UTF8String], NULL, 0); 
NSNumber *songIDNumber = [NSNumber numberWithUnsignedLongLong:ullvalue]; 

Trả lời

4

9223372036854775807 thập phân là 0x7FFFFFFFFFFFFFFF trong hex. Số của bạn là 10359537395704663785, quá lớn đối với số long long và bị tràn. Từ số NSString documentation:

Trả về LLONG_MAX hoặc LLONG_MIN khi bị tràn.

5

longLongValuereturnsLLONG_MAX trong trường hợp tràn bộ nhớ, và LLONG_MAX là chính xác những gì bạn nhận được, 9223372036854775807. Bạn giá trị chỉ đơn giản là không phù hợp trong long long

Hãy thử sử dụng NSDecimalNumber để thay thế.

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