2010-08-24 10 views
7

Człowiek najprostszy rzeczy zawsze wydaje się tak szalony w Objective-C do mnie, w każdym razie muszę zrobić podstawowe odejmowanie i mnożenie i jestem zakłopotany.podstawowy problem matematyczny z liczbami całkowitymi i NSDecimalNumber - nieważne operandy na binarne

mam:

client.PricingDiscount <-- this is an Integer 16 property on a CoreData NSManagedObject 
sku.RetailPrice <-- this is a Decimal property on a CoreData NSManagedObject 

Ja po prostu próbuje uzyskać NSDecimalNumber wyświetlać tak:

NSDecimalNumber *showPrice = sku.RetailPrice * (100 - client.PricingDiscount); 

Próbowałem kilka różnych form tego i nie może dowiedzieć się, co do diabła, robię źle tutaj.

+0

Co błędu Dostajesz? –

Odpowiedz

10

operatorzy standardowe nie może być używany z NSDecimalNumber

NSDecimalNumber *one = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithInt:100] decimalValue]]; 
NSDecimalNumber *factor = [one decimalNumberBySubtracting:[NSDecimalNumber decimalNumberWithDecimal:[client.PricingDiscount decimalValue]]]; 
NSDecimalNumber *showPrice = [sku.RetailPrice decimalNumerByMultiplying:factor]; 
+1

Proponuję utworzyć NSDecimalNumber z wartości NSString @ "100" dla pierwszej linii, w aby uniknąć błędów pełzających z wkradania się. –

+0

Konwersja z int do NSDecimalNumber jest bezstratna, nawet z zmiennoprzecinkowym, w tym przypadku - 100 jest bezpośrednio reprezentowane przez wszystkie typy pierwotne, w tym 'double' i' float'. –

3

NSDecimalNumber to wrapper obiektu dla liczby - traktujesz go jak wartość C. Zamiast tego, spróbuj:

float price = [sku.retailPrice floatValue] * (100 - [client.pricingDiscount floatValue]); 
NSDecimalNumber *showPrice = [NSDecimalNumber numberWithFloat:price]; 

To dziwne, ale NSNumber i NSDecimalNumber są owijarki Objective-C dla typów C, zazwyczaj używany do przechowywania przedmiotów w pojemniku, takim jak NSArray (lub Core danych). NSInteger i NSDecimal, z drugiej strony, są typami C (NSInteger tylko map do int).

EDYCJA: Odpowiedź Falconcreek jest lepsza dla uniknięcia utraty dokładności. Podczas pracy z liczbami całkowitymi zwykle używasz rozpakowanych typów C.

+2

Ryzyko utraty precyzji konwersji elementu retailPrice do wartości zmiennoprzecinkowej. Trzymaj się 'NSDecimalNumber' – falconcreek

+0

Słusznie, falconcreek, cały powód, dla którego chcesz używać numeru NSDecimalNumber dla waluty, to unikanie błędów zmiennoprzecinkowych w twoich obliczeniach. Zobacz jego odpowiedź, aby uzyskać dokładniejszy sposób robienia tego. –

+0

Tak, niestety nie ma autoboxingu w Objective-C. Jedną z rzeczy, których najbardziej brakuje mi w innych językach. –

0
NSDecimalNumber *showPrice = sku.RetailPrice * (100 - client.PricingDiscount); 

NSDecimalNumber to klasa. To, co tu robisz, polega na obliczaniu wartości, a następnie przypisywaniu jej jako wartości wskaźnika do obiektu NSDecimalNumber. To jest złe mojo.

Nie używałem NSDecimalNumber wcześniej, ale jeśli trzeba, że ​​dany obiekt, co chcesz, jest coś takiego:

NSNumber* number = [NSNumber numberWithFloat:(sku.RetailPrice * (100 - client.PricingDiscount))]; 
NSDecimal* decimal = [number decimalValue]; 
NSDecimalNumber* showPrice = [NSDecimalNumber decimalNumberWithDecimal:decimal]; 
+0

(sku.RetailPrice * (100 - client.PricingDiscount) -> RetailPrice jest instancją NSDecimalNumber, to nie zadziała – falconcreek

Powiązane problemy