Tracks
/
Elixir
/
Exercises
/
Freelancer Rates

Freelancer Rates

Learning Exercise

Introduction

Integers

There are two different kinds of numbers in Elixir - integers and floats.

Integers are whole numbers.

``````integer = 3
# => 3
``````

Floating Point Numbers

Floats are numbers with one or more digits behind the decimal separator. They use the 64-bit double precision floating-point format.

``````float = 3.45
# => 3.45
``````

Working with numbers

In the `Integer` and `Float` modules you can find some useful functions for working with those types. Basic arithmetic operators are defined in the `Kernel` module.

Conversion

Integers and floats can be mixed together in a single arithmetic expression. Using a float in an expression ensures the result will be a float too.

``````2 * 3
# => 6

2 * 3.0
# => 6.0
``````

However, when doing division, the result will always be a float, even if only integers are used.

``````6 / 2
# => 3.0
``````

To convert a float to an integer, you can discard the decimal part with `trunc/1`.

Instructions

In this exercise you'll be writing code to help a freelancer communicate with a project manager by providing a few utilities to quickly calculate daily and monthly rates, optionally with a given discount.

We first establish a few rules between the freelancer and the project manager:

• The daily rate is 8 times the hourly rate.
• A month has 22 billable days.

Sometimes, the freelancer is offering to apply a discount on their daily rate (for example for their most loyal customers or for non-for-profit customers).

Discounts are modeled as fractional numbers representing percentage, for example `25.0` (25%).

1. Calculate the daily rate given an hourly rate

Implement a function to calculate the daily rate given an hourly rate:

``````FreelancerRates.daily_rate(60)
# => 480.0
``````

The returned daily rate should be a float.

2. Calculate a discounted price

Implement a function to calculate the price after a discount.

``````FreelancerRates.apply_discount(150, 10)
# => 135.0
``````

The returned value should always be a float, not rounded in any way.

3. Calculate the monthly rate, given an hourly rate and a discount

Implement a function to calculate the monthly rate, and apply a discount:

``````FreelancerRates.monthly_rate(77, 10.5)
# => 12130
``````

The returned monthly rate should be rounded up (take the ceiling) to the nearest integer.

4. Calculate the number of workdays given a budget, hourly rate and discount

Implement a function that takes a budget, an hourly rate, and a discount, and calculates how many days of work that covers.

``````FreelancerRates.days_in_budget(20000, 80, 11.0)
# => 35.1
``````

The returned number of days should be rounded down (take the floor) to one decimal place.

Edit via GitHub