# Numbers#

Numbers in Ruby belongs to two general classes: `Fixnum`

- all the fixed-point and `Float`

- for the floating-point numbers. Despite all the numbers are objects, you don’t have to initialize them with class method `new`

. The interpreter will find out what type the number is:

```
42.class # class of 42 object is Fixnum
#=> Fixnum
3.1415926.class # but of the floating-point object it is Float
#=> Float
s = 42 + 3.1415926 # adding integer to real is possible and gives Float
#=> 45.1415926
s.class
#=> Float
s = 41 + 1.0 # to constrain the value of the expression is Float
#=> 42.0
s.class
#=> Float # division of two integers gives always integer
42 / 5
#=> 8
42 / 5.0 # to ensure the value of division is a float
#=> 8.4
42.fdiv(5) # or use fload-division method
#=> 8.4
```

42 is a `Fixnum`

, 3.14 is a `Float`

and the result of adding this two number is a `Float`

as well. In general, all the operations on the numbers, which one of them is a `Float`

, results with the number of `Float`

class. But the operations on the `Fixnum`

gives the number of `Fixnum`

, which can confuse on division, when the result is truncated to the integer - like at the line 13 of above example. To avoid it, declare one of the numbers as `Float`

, simply adding `.0`

to it (line 15). Alternatively, you may use `fdiv`

(float div) instance method of `Fixnum`

class.

## Hexadecimal and Binary#

Ruby allows integers to be written not only as decimal numbers, but hexadecimal, octal and binary as well. To write the hex number proceed it with `0x`

(like `0xdeadbaba`

), to wrote an octal use `0`

(like in file permissions in Shell - for example `0744`

), and to deal with binary use `0b`

before the number.

Another interesting way to write numbers in Ruby is to add underscore `_`

between the digits. This character is ignored, so it can be used to group some digits. For example, instead of writing one billion this way `1000000000`

you can use another way, more readable for humans: `1_000_000_000`

, or group the half octets in binary numbers: `0b0000_1000_1000_1000`

.

## Rational and Complex#

`Fixnum`

and `Float`

are not the only number classes in Ruby. There is a `Complex`

class as well. We do not want to describe it in details, just take a look at the interesting way of notation - there is a method `i`

for both number classes, which converts the given number into the imaginary part of the complex. So, to write 3 + i5, use natural Ruby syntax: `3 + 5.i`

. This is possible only in Ruby!

There is a `Rational`

class in Ruby, so you may work with rational numbers as well. To describe a number 1/2 use the constructor: `Rational(1, 2)`

or convert the number or the string by the `to_r`

method: `’1/2’.to_r`

. Thus, to divde 1/3 by half, you may describe it like this:

```
'1/3'.to_r / Rational(1, 2)
#=> (2/3)
```

## Methods and Operator on Numbers#

There is a number of methods and operators for numbers in Ruby. There is no need to describe all of them here, as there is everything about it in Ruby documentation, so let’s focus on most interesting:

`class`

- already known method returns class of the object; notice it is not returning string with its name, but actuall class, which is an object of type Class`methods`

- this method refers not only to numbers but for all the objects in Ruby; it returns all the method names available for the given object instance`zero?`

- methods ending with question mark usually returns true or false; this function checks if the number is zero (so`0.zero?`

is true)`round`

- rounds to floating point number to the nearest fixed point`==`

- equality operator allows to compare the numbers of different types: you do not have to bother with conversion. In Ruby`42 == 42.0`

is`true`

`<=>`

comparition operator - often called "a spaceship operator": returns -1 if the object on the left is lesser than the object on the right, 1 - if the right object is greater and 0 if the objects are equal`**`

- this is a power operator in Ruby, so`2 ** 8`

gives`256`

- bitwise operators:
`& | ^`

-`&`

does binary AND,`|`

is binary OR and`^`

means XOR; so`0b1010 ^ 0b1001 == 0b0011`

`to_s`

- converts current number to string`to_i`

- converst the number to interger

```
1.class
#=> Fixnum # the class of instance 1 is Fixnum
1.class.class
#=> Class # the class of Fixnum (1.class) is Class
3.14.methods
#=> [:to_s, :inspect, :coerce, :-@, :+, :-, :*, :/, :quo, :fdiv, :%, :modulo, :divmod, :**, :==, :===, :<=>, :>, :>=, :<, :<=, :eql?, :hash, :to_f, :abs, :magnitude, :zero?, :to_i, :to_int, :floor, :ceil, :round, :truncate, :nan?, :infinite?, :finite?, :numerator, :denominator, :to_r, :rationalize, :arg, :angle, :phase, :singleton_method_added, :i, :+@, :div, :remainder, :real?, :integer?, :nonzero?, :step, :to_c, :real, :imaginary, :imag, :abs2, :rectangular, :rect, :polar, :conjugate, :conj, :pretty_print_cycle, :pretty_print, :between?, :pretty_print_instance_variables, :pretty_print_inspect, :nil?, :=~, :!~, :class, :singleton_class, :clone, :dup, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :frozen?, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :extend, :display, :method, :public_method, :define_singleton_method, :object_id, :to_enum, :enum_for, :pretty_inspect, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__, :__id__]
0.5.round
#=> 1
0.49.round
#=> 0
10.0.to_i
#=> 10
10.0.to_s
#=> "10.0"
```