2012-01-05 11 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]); 

両方の値がULONG_LONG_MAXより小さい。しかし、出力に表示されるものは次のとおりです。目的C奇数小数点からロング変換への変換

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 

私は間違っていますか?私はこの振る舞いをどう説明するのか分かりません。

答えて

5

NSDecimalNumberにはunsignedLongLongValueメソッドがないため、デフォルトの実装がNSNumberから継承されます。 NSDecimalNumberの値を取得する唯一の方法は、NSDecimal構造体またはdouble構造体を取得することです。変換エラーはNSDecimalNumberdoubleに変換するプロセスで導入されました。

+0

私は初めからそれを得ておらず、自分の答えを投稿しましたが、今はそれを得て、あなたの答えは私と同じです。私と同じように、誰もが完全に理解していない人たちのために、 'NSDecimalNumber'内の小数はunsigned long longにキャストする前にdoubleにキャストされます。とにかく、SDKの基本的なバグだと思います。 @AlexanderN。 –

+0

私はこれが基本的なSDKの欠点であることに同意しません:もしあなたが 'NSDecimalNumber's内にいれば、SDKのデザイナーにとって重要な確固たる精度が得られます。単なる便宜のために他のタイプへの変換があります。表現の違いによっていくらかの精度が失われる可能性があることが理解されています。 – dasblinkenlight

+0

私はそれをundestand。しかし、float-intキャストのように、これはちょっと変わった整数(この場合)の小数点から整数のlong long型で精度が落ちると思いませんか? –

関連する問題