2012-07-08 36 views
6

Tôi muốn thực hiện một số phép tính đơn giản trên NSNumbers và bảo toàn loại. Điều này có thể không?Số học NSNumber

Ví dụ:

- (NSNumber *)add:(NSNumber *)firstNumber to:(NSNumber *)secondNumber; 

là định nghĩa phương pháp của tôi, và firstNumber và secondNumber là các số nguyên sau đó tôi muốn trả lại một số nguyên đó là việc bổ sung nguyên của họ cả. Tương tự, nếu cả hai đều tăng gấp đôi thì trả về kết quả là gấp đôi. Có vẻ như tôi có thể nhận được loại (ngoại trừ boolean) bằng cách sử dụng [NSNumber objCType] như được tìm thấy trong câu hỏi này: get type of NSNumber nhưng tôi không thể trích xuất các loại đó và thực hiện phép tính mà không cần nhiều mã để trích xuất các giá trị tính toán và trả về kết quả cho mọi loại có thể.

Có cách nào ngắn gọn và súc tích để thực hiện việc này không?

+0

Bạn định làm gì nếu có các loại khác nhau? –

+0

Vui lòng ném lỗi hoặc sử dụng loại firstNumber làm mẫu. Cả hai sẽ làm việc cho những gì tôi cần. –

+0

Không có cách nào ngắn gọn để làm điều đó. – sosborn

Trả lời

10

Nếu bạn muốn thực hiện số học, đặt cược tốt nhất sẽ sử dụng số NSDecimalNumber.

NSDecimalNumber có phương pháp để thực hiện phép tính số học như:

– decimalNumberByAdding: 
– decimalNumberBySubtracting: 
– decimalNumberByMultiplyingBy: 
– decimalNumberByDividingBy: 
– decimalNumberByRaisingToPower: 
– decimalNumberByMultiplyingByPowerOf10: 
– decimalNumberByAdding:withBehavior: 
– decimalNumberBySubtracting:withBehavior: 
– decimalNumberByMultiplyingBy:withBehavior: 
– decimalNumberByDividingBy:withBehavior: 
– decimalNumberByRaisingToPower:withBehavior: 
– decimalNumberByMultiplyingByPowerOf10:withBehavior: 

Và kể từ NSDecimalNumber kéo dài NSNumber nó cũng có tất cả các phương pháp của một NSNumber, vì vậy tôi nghĩ rằng bạn có thể sử dụng nó trong trường hợp của bạn mà không cần bất kỳ vấn đề.

+0

Tôi đã làm việc với Cocoa Touch trong hơn một năm và tôi chưa bao giờ nghe nói về lớp học này !! Khùng!! +1! – borrrden

3

Đối với gần như tất cả các ứng dụng, bạn sẽ được chuyển đổi thành double và quay lại sử dụng -doubleValue–initWithDouble:. Điều này sẽ cho phép bạn sử dụng các ký hiệu C chuẩn (+, -, ...) và chức năng (exp(), sin()). Cách duy nhất bạn gặp phải là rắc rối nếu bạn đang sử dụng gần với độ chính xác đầy đủ cho các giá trị số nguyên 64 bit.

Nếu bạn muốn gắn bó với các hoạt động của lớp Objective-C, bạn có thể sử dụng NSDecimalNumber để thay thế.

Xem thêm: How to add two NSNumber objects?

2

Làm thế nào về tính giá trị biểu hiện như là một đôi (với tất cả các đầu vào như giá trị tăng gấp đôi), và sau đó kiểm tra nếu kết quả là một số nguyên? Sau đó, bạn chỉ cần sử dụng NSNumber numberWithInt: hoặc NSNumber numberWithDouble: để trả lại kết quả.

Khi bạn kiểm tra xem giá trị kết quả có phải là số nguyên không, hãy đảm bảo tính đến lỗi làm tròn (ví dụ: khi 1 được biểu thị bằng 0.99999999, v.v.).

EDIT: Chỉ cần nhận thấy trong các tài liệu cho NSNumber cụm từ này:

Lưu ý rằng đối tượng số không nhất thiết duy trì kiểu họ tạo ra với.

Tôi nghĩ điều này có nghĩa là bạn không thể tin được những gì bạn đang cố gắng làm.

+0

Bạn thậm chí không cần phải đi xa như vậy. Điểm của NSNumber là trừu tượng hóa điều đó. Nó hoàn toàn hạnh phúc bằng cách sử dụng chỉ tăng gấp đôi.Vì bạn trả lại một NSNumber, bạn có thể kéo bất kỳ biểu diễn nào mà bạn muốn, bất kể bạn đã nhập gì. Xem đoạn trích này mà tôi đã tạo: http://ideone.com/HwIOa – borrrden

+0

Tôi nghe bạn! Cá nhân tôi nghi ngờ tôi đã bao giờ cần phải làm bất kỳ điều này :) Tôi chỉ cố gắng giải quyết vấn đề của OP. Cho dù điều này có ý nghĩa trong chương trình lớn của sự vật, là một câu hỏi khác, và tôi không có đủ ngữ cảnh để nói điều đó. – Macondo2Seattle