Xử lý số trong Ruby
Nào ta cùng chơi với những con số
Trong Ruby, số nào không có dấu “.” sẽ được xếp vào loại số nguyên. Các số có phần lẻ có dấu “.” theo sau ít nhất 1 chữ số được gọi là số thực – floating-point numbers (floats). Hãy cùng chạy thử đoạn code sau:
=begin Ruby numbers Usual operators: + addition - subtraction * multiplication / division =end #integer [operator] integer = integer puts 1 + 2 puts 2 * 3 puts 3/2 # this will still return an integer number #Calculation involving at least one float results in #a float result puts 1 + 2.0 puts 2 * 3.0 puts 3.0/2
Số nguyên trong Ruby có thể thuộc lớp Fixnum hoặc Bignum (tùy vào số đó thuộc loại lớn hay nhỏ). Cả hai lớp này đều thừa kế từ lớp Integer (lớp này lại thừa kế từ Numeric).
Số thực lại là đối tượng thuộc lớp Float, tương ứng với dữ liệu dạng double.
Sơ đồ trên dựa trên sơ đồ của Donald Craig.
Bây giờ ta hãy thử đoạn code mẫu này trong cuốn Beginning Ruby của Peter Cooper (đừng lo nếu bạn không hiểu ý nghĩa của nó ngay)
rice_on_square = 1
64.times do |square|
puts "On square #{square + 1} are #{rice_on_square} grain(s)"
rice_on_square *= 2
end
Chắc bạn đã biết câu chuyện về một nhà toán học đánh cờ với một ông vua ở Ấn Độ. Nhà toán học đánh cược rằng nếu ông thắng, nhà vua sẽ trả cho ông số gạo theo quy tắc: ô 1 của bàn cờ có 1 hạt gạo, ô 2 có 2 hạt, ô 3 có 4 hạt, ô 4 có 8 hạt .v.v. cứ thế đến hết 64 ô. Và cuối cùng thì nhà toán học thắng cờ thật.
Như vậy ô 64 sẽ chứa đến hàng nghìn tỷ hạt gạo. Tổng số hạt gạo theo như tôi nhớ sẽ có thể trải khắp bề mặt trái đất dày đến 3 cm.
Ví dụ trên chứng tỏ rằng Ruby có thể xử lý được những con số cực lớn, và không như các ngôn ngữ lập trình khác, không có một giới hạn định sẵn nào của ngôn ngữ (tất nhiên là vẫn tùy vào bộ nhớ của máy tính bạn).
Cách xử lý của Ruby là, khi tạo một số nguyên, nó sẽ được Ruby tự động xếp vào đối tượng của một trong 2 lớp: Bignum (các số lớn) và Fixnum (các số nhỏ và bình thường). Khi bạn thực hiện các phép tính đối với các con số của bạn, Ruby cũng tự động cân nhắc xem dùng loại số nào là phù hợp. Do đó, bạn sẽ chả phải lo nghĩ về giới hạn biến số, hoặc là tự viết bằng tay các hàm tính số lớn như ở một số ngôn ngữ khác.
Các toán tử và phép ưu tiên
Dưới đây là bảng liệt kê các toán tử theo thứ tự phép ưu tiên từ cao nhất đến thấp nhất
Chú ý:
a. Toán tử ++ và – không tồn tại trong Ruby, cũng như dạng “pre” hoặc “post”.
b. Nguyên lý ưu tiên đối với dấu ngoặc không thay đổi so với lý thuyết số học phổ thông: bất kỳ phép tính nào nằm bên trong 2 dấu ngoặc sẽ được tính trước (nghĩa là được ưu tiên hơn).
Phép chia lấy dư (modulus) được tính như sau:
puts (5 % 3) # prints 2 puts (-5 % 3) # prints 1 puts (5 % -3) # prints -1 puts (-5 % -3) # prints -2
Chú thích của người dịch: Trong chương này, ta gọi các phép toán trên là toán tử (operator). Nhưng thực ra, các toán tử này là các phương thức đặc biệt của lớp đối tượng số tương ứng. Hai dòng code sau cho ra cùng một kết quả:
puts 2 * 3 puts 2*(3)
Tài liệu đọc thêm:
Learn to Program
The Philosophy of Ruby
Ruby Basics (QuickTime audio)


