# numbers.md

```<!-- next_step "variables" -->

# Numbers

The following operations work on numbers:

* - -- subtraction
* * -- multiplication
* / -- division
* % -- modulus
* ** -- exponentiation

# LAB: Playing With Numbers

Answer the following questions using irb:

* How many seconds are in an hour?
* How many minutes are in a week?
* How many seconds old are you?
* How many years old is someone who is 1 billion seconds old?

# Order of operations

Q: What is 1 plus 2 times 3?

A: *It depends!*

* `(1 + 2) * 3` is 9
* `1 + (2 * 3)` is 7

# Parentheses Are Free

When in doubt, use parentheses!

# Strings vs. Numbers

Hmmm....

1 + 2
"1" + "2"
"1 + 2"

# Strings plus Numbers

Hmmm again...

"1" + 2

Uh-oh!

TypeError: can't convert Fixnum into String

The problem is that Strings and Numbers are different TYPES, aka different CLASSES.

Don't panic! The solution is easy.

# Type Conversion

Numbers know a message that converts them into strings. `to_s` means "to string".

"1" + 2.to_s

Likewise, strings know a message that converts them into numbers.

1 + "2".to_i

`to_i` means "to integer".

Try this in irb!

# WTFixnum?

The error said `can't convert Fixnum into String`.

Q: What is a Fixnum?

A: It's one type of number.

# Math is hard

There are many types of numbers!

Each is useful in different situations.

Without getting into too much detail, the two main number types in Ruby are:

* `Fixnum` - for *integers* like 12 or -1023
* `Float` - for *decimals* like 3.14

(Other number types include Complex, Rational, and Bignum.)

# Number to Number

You can convert from one type of number to another by sending a message:

* `to_i` turns a Float into a Fixnum
* `to_f` turns a Fixnum into a Float

Try this:

3.to_f
3.14.to_i

# String to Number

`to_f` and `to_i` also work on Strings:

"3.14".to_f
"3.14".to_i

and `to_s` works on numbers:

3.14.to_s

# Arithmetic

Try this in irb:

1 + 2
3 - 4
5 * 6
7 / 8

Whoa! What just happened?

# Integer Arithmetic

7 and 8 are *Integers*

so the result is an Integer

7/8 is somewhere between 0 and 1

but there is no integer between 0 and 1

so the computer has to *round down* to 0

# Floating Point Arithmetic

7.0/8.0

7.0 and 8.0 are *Floats*

so the result is a Float

and `0.875` can fit in a float

# Okay, that's enough math!

```