2015-06-20 25 views
1

我有一個簡單的例子使用foat VS NSDecimalNumber之間進行比較:浮子VS NSDecimalNumber計算

NSDecimalNumber *n1 = [[NSDecimalNumber alloc] initWithDouble:33.23]; 
    NSDecimalNumber *n2 = [[NSDecimalNumber alloc] initWithDouble:78.35]; 

    NSDecimalNumber *n3 = [n1 decimalNumberByDividingBy:n2]; 

    NSLog(@"decimalNumber n3 %@", n3); 


    double d1 = 33.230000000000000; 
    double d2 = 78.350000000000000; 

    double d3 = d1/d2; 

    NSLog(@"double d3 %f", d3); 

結果:

decimalNumber n3 0.42412252712188889444798978940650925335 
double d3 0.424123 

問題:

  1. 爲什麼我have't的相同的結果?我認爲浮動分區圍繞結果,我們可以用浮點數進行分區而不會舍入結果嗎?

回答

2

它是由於這樣的精度,位數和兩種類型的基極之間的差異。 doublefloat內部使用基數爲2的數字,精度較低,NSDecimalNumber使用基數爲10,精度也較高。它與分數和小數相似,例如,1/3和0.333333333333333333不完全相同。在網絡上有很多關於SO和更廣泛的答案,以及介紹性的CS教科書,這些教科書都有詳細的介紹。 HTH

+0

感謝您的回答,將會回覆所有這些:) – samir

+0

問題不是舍入,而是%f的默認精度。如果你使用''NSLog(@「double d3%.16f」,d3);'結果將是:「double d3 0.4241225271218890」。注意:double用64位表示,精度約爲16位十進制數字。 一個'NSDecimalNumber':可以表示一個十進制整數,最多爲38位十進制數字。 – zaph

2

我認爲這是更多的NSLog問題,而不是一個舍入問題。

嘗試登錄[n3 doubleValue]代替:

NSLog(@"decimalNumber n3 %f", [n3 doubleValue]); 
+0

我不認爲這是一個NSLog問題,但doubleValue女巫也許在轉換它之前舍入十進制數字。 – samir

+0

%f默認情況下將該值舍入爲小數點後的6位數。例如,您可以通過在%.10f中更改%f來嘗試打印更多數字。 – ortnec

+0

NSLog(@「d3%.38f」,d3);打印:0.42412252712188897030287648703961167485 – samir