What I didn’t know about Ruby Numbers

I have been coding with Ruby on rails & React.js for two years now as a professional developer, but I had this feeling that while learning Ruby and Rails, there were tons of little notions that I didn’t really understood. I use to write things in order to learn them so here is a series of short articles about what I didn’t know.

The Numeric Class

In Ruby, what we call “numbers” are all objects from the Numeric class as we can see on the following diagram :

Fixnum and Bignum

Fixnum are representing small integers and Bignum are representing big integers. As the doc says : “Holds Integer values that can be represented in a native machine word (minus 1 bit).”

Since ruby 2.4, Fixnum and Bignum are unified under the Integer class, so depending on your ruby version, you will get a different behavior.

You can use underscores to get more readable numbers when they reach one thousand.

Divmod vs Modulo operators

As the doc specifies, Divmod is a method that returns an array containing the quotient and modulus obtained by dividing num by numeric., in other words :

Using the modulo operator (%) with positive values is pretty easy to understand as it gives you the rest of a division :

but using it with negative values can be really complicated. I am not going to explain it deeper here and I prefer to give you some resources that will do it far better than me :

Why is the behavior of the modulo operator (%) different between C and Ruby for negative integers?

Exploring the difference between modulus and remainder in Ruby’s Numeric class

Floats are not exact …

Every developer knows that float are decimal numbers but I didn’t know that floats were inexact real numbers.

This is due to the limited number of bytes that can store a Float, so sometimes a Float is not exactly equals to what you think… And here comes the BigDecimal class.

… but BigDecimals are

BigDecimal provides arbitrary-precision floating point decimal arithmetic. In some precise cases, you will need to use BigDecimal in order to overcome the inexactitude of floats.

Rationals

The docs says that a rational number can be represented as a pair of integer numbers: a/b (b>0), where a is the numerator and b is the denominator. In other words, rationals are similar to fractions.

You can run all the “+”, “ /”, “-” and “*” operations between Rationals

The last word

I know there are lots of other concepts around the Numeric class but that’s all for this article, feel free to improve my explanation in the comments, I might add more concepts here in the future 👋

Written by