2010-08-24 67 views
7

Man những thứ đơn giản nhất luôn luôn có vẻ rất điên trong Objective-C với tôi, dù sao tôi cần phải làm một số phép trừ cơ bản và các phép nhân và đang bối rối.bài toán cơ bản với Integer và NSDecimalNumber - toán hạng không hợp lệ để nhị phân

tôi có:

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

Tôi chỉ đơn giản là cố gắng để có được một NSDecimalNumber để hiển thị như sau:

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

Tôi đã thử một loạt các hình thức khác nhau của việc này và không thể tìm ra những gì Tôi đang làm sai ở đây.

+0

lỗi gì bạn đang nhận được? –

Trả lời

10

khai thác tiêu chuẩn không thể được sử dụng với 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

Tôi khuyên bạn nên tạo NSDecimalNumber từ giá trị NSString của @ "100" cho dòng đầu tiên, trong –

+0

Chuyển đổi từ một int sang một NSDecimalNumber là lossless ngay cả với điểm nổi, trong trường hợp này - 100 là trực tiếp thể hiện bởi tất cả các kiểu nguyên thủy, bao gồm 'double' và' float'. –

3

NSDecimalNumber là trình bao bọc đối tượng cho một số - bạn đang xử lý nó như một giá trị C. Thay vào đó, hãy thử:

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

Đó là khó hiểu, nhưng NSNumberNSDecimalNumber là Objective-C wrappers với nhiều loại C, thường được sử dụng để lưu trữ trong các vật chứa như NSArray (hoặc Core Data). Mặt khác, NSIntegerNSDecimal là các loại C (NSInteger chỉ là bản đồ đến int).

CHỈNH SỬA: Câu trả lời của câu trả lời của câu trả lời là tốt hơn để tránh mất chính xác. Tuy nhiên, khi làm việc với các số nguyên, bạn thường sẽ sử dụng các loại C không được hộp.

+2

Rủi ro mất độ chính xác khi chuyển đổi giá bán lẻ sang phao. Gắn bó với 'NSDecimalNumber' – falconcreek

+0

quyền của chim ưng, toàn bộ lý do bạn muốn sử dụng NSDecimalNumber cho tiền tệ là để tránh các lỗi dấu phẩy động trong các phép tính của bạn. Xem câu trả lời của anh ấy để có cách làm chính xác hơn. –

+0

Vâng, tiếc là không có autoboxing trong Objective-C. Một trong những điều tôi nhớ nhất từ ​​các ngôn ngữ khác. –

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

NSDecimalNumber là một lớp học. Những gì bạn đang làm ở đây là tính toán một giá trị, và sau đó gán giá trị đó là giá trị của một con trỏ tới một đối tượng NSDecimalNumber. Đây là mojo xấu.

tôi đã không sử dụng NSDecimalNumber trước đó, nhưng nếu bạn cần có đối tượng cụ thể, những gì bạn muốn là một cái gì đó như thế này:

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 là một thể hiện của NSDecimalNumber điều này sẽ không hoạt động – falconcreek

Các vấn đề liên quan