Lấy đoạn mã sau:NSJSONSerialization deserialize numbers là NSDecimalNumber?
NSError *error;
NSString *myJSONString = @"{ \"foo\" : 0.1}";
NSData *jsonData = [myJSONString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *results = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
Câu hỏi của tôi là, là results[@"foo"]
một NSDecimalNumber, hoặc một cái gì đó với độ chính xác nhị phân hữu hạn giống như một đôi hoặc nổi? Về cơ bản, tôi có một ứng dụng đòi hỏi độ chính xác mất mát đi kèm với một NSDecimalNumber
và cần đảm bảo rằng việc deserialization JSON không dẫn đến làm tròn vì đôi/nổi etcetera.
Ví dụ: nếu nó được hiểu như là một phao, tôi muốn chạy vào các vấn đề như thế này với độ chính xác:
float baz = 0.1;
NSLog(@"baz: %.20f", baz);
// prints baz: 0.10000000149011611938
tôi đã cố gắng giải thích foo
như một NSDecimalNumber và in kết quả:
NSDecimalNumber *fooAsDecimal = results[@"foo"];
NSLog(@"fooAsDecimal: %@", [fooAsDecimal stringValue]);
// prints fooAsDecimal: 0.1
Nhưng sau đó tôi thấy rằng gọi stringValue
trên một NSDecimalNumber
không in tất cả các chữ số có nghĩa dù sao, ví dụ ..
NSDecimalNumber *barDecimal = [NSDecimalNumber decimalNumberWithString:@"0.1000000000000000000000000000000000000000000011"];
NSLog(@"barDecimal: %@", barDecimal);
// prints barDecimal: 0.1
... để in fooAsDecimal
không cho tôi biết liệu results[@"foo"]
có được làm tròn ở độ chính xác hữu hạn bởi trình phân tích cú pháp JSON hay không.
Để rõ ràng, tôi nhận thấy tôi có thể sử dụng chuỗi thay vì một số trong biểu diễn JSON để lưu giá trị của foo, tức là "0.1"
thay vì 0.1
và sau đó sử dụng [NSDecimalNumber decimalNumberWithString:results[@"foo"]
]. Nhưng, những gì tôi quan tâm là làm thế nào lớp NSJSONSerialization deserializes số JSON, vì vậy tôi biết cho dù điều này là thực sự cần thiết hay không.
Điều này không đúng. Định dạng JSON không quan tâm đến độ chính xác của float hoặc double. Đó là trình phân tích cú pháp JSON mất độ chính xác. – Sulthan
@icodestuff: nếu tôi chạy mã của bạn bằng cách sử dụng 'double dl = 8.92918e-128;', 'dict_back' là' nil'. Bạn có bất kỳ ý tưởng nào nếu có một cách để lấy JSON deserialisation để làm việc cho các giá trị như vậy bằng cách sử dụng 'NSJSONSerialization' hoặc các thư viện khác? – sergio
Như Sulthan đã nói, JSON không quan tâm đến độ chính xác. Nếu API của Apple tuân theo các thông số kỹ thuật, nó sẽ sử dụng NSDecimalNumber. – xtravar