2010-04-04 43 views
3

ExclusivePrice,數量都是NSDecimalNumbers。NSDecimalNumber乘法奇怪

NSDecimalNumber *price = [exclusivePrice decimalNumberByMultiplyingBy:quantity]; 
NSLog(@"%@ * %@ = %@", exclusivePrice, quantity, price); 

結果我得到:

2010-04-05 00:22:29.111 TestApp[13269:207] 65 * 2 = -0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007169919476068871316457914368 

我期待什麼:

2010-04-05 00:22:29.111 TestApp[13269:207] 65 * 2 = 130 

任何人能解釋這個嗎?

編輯:

全部攝製:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
NSDecimalNumber *n2 = (NSDecimalNumber *)[formatter numberFromString:@"2"]; 
NSDecimalNumber *n1 = (NSDecimalNumber *)[NSDecimalNumber numberWithInt:65]; 
NSDecimalNumber *n3 = [n1 decimalNumberByMultiplyingBy:n2]; 
NSLog(@"%@ * %@ = %@", n1, n2, n3); 

回答

3

我找到了答案:據How to use NSDecimalNumber?我不能輕易的NSNumber和NSDecimalNumber之間的轉換。爲了從一個轉換到其他的我必須做的:

NSDecimalNumber *n2 = [NSDecimalNumber decimalNumberWithDecimal: 
           [[formatter numberFromString:@"2"] decimalValue]]; 

這本來是很好,如果NSNumberFormatter有decimalNumberFromString:方法。

+0

我只是看着它。看來NSNumber用於格式化和簡單比較,而在使用十進制數的算術運算中使用NSDecimalNumber。所以雖然你可以從字符串創建NSDecimalNumber,但是你不能從double或float創建它,但你可以從int或float創建NSNumber ... – stefanB 2010-04-04 23:29:40

6

似乎爲我工作。

NSDecimalNumber * n1 = [NSDecimalNumber decimalNumberWithString:@"65"]; 
NSDecimalNumber * n2 = [NSDecimalNumber decimalNumberWithString:@"2"]; 

NSDecimalNumber * res = [n1 decimalNumberByMultiplyingBy:n2]; 

NSLog(@"%@ * %@ = %@", n1, n2, res); 

輸出:

2010-04-05 08:40:42.812 x[24301] 65 * 2 = 130 
+0

是啊,我很困惑。我現在在一個不同的項目中嘗試過同樣的事情,它也適用於我。不知何故,這對我而言並不適合在重要的項目中使用。 – rein 2010-04-04 22:49:35

+0

如何在項目失敗時初始化這些值? – stefanB 2010-04-04 22:54:53

+0

我已經在我的問題中添加了完整的repro。我假設從格式化程序投射出現錯誤? – rein 2010-04-04 23:05:18