A friend of mine runs a pharmacy.   He has a specialized function in his Dispensary application which receives a decimal value of currency and replaces it to a standard value.   This value is regulated by a government department.



Task

Given a floating point value between   0.00   and   1.00,   rescale according to the following table:

>=  0.00  <  0.06  :=  0.10
>=  0.06  <  0.11  :=  0.18
>=  0.11  <  0.16  :=  0.26
>=  0.16  <  0.21  :=  0.32
>=  0.21  <  0.26  :=  0.38
>=  0.26  <  0.31  :=  0.44
>=  0.31  <  0.36  :=  0.50
>=  0.36  <  0.41  :=  0.54
>=  0.41  <  0.46  :=  0.58
>=  0.46  <  0.51  :=  0.62
>=  0.51  <  0.56  :=  0.66
>=  0.56  <  0.61  :=  0.70
>=  0.61  <  0.66  :=  0.74
>=  0.66  <  0.71  :=  0.78
>=  0.71  <  0.76  :=  0.82
>=  0.76  <  0.81  :=  0.86
>=  0.81  <  0.86  :=  0.90
>=  0.86  <  0.91  :=  0.94
>=  0.91  <  0.96  :=  0.98
>=  0.96  <  1.01  :=  1.00



import random, strformat
 
# Representation of a standard value as an int (actual value * 100).
type StandardValue = distinct int
 
proc `<`(a, b: StandardValue): bool {.borrow.}
 
const Pricemap = [10, 18, 26, 32, 38, 44, 50, 54, 58, 62, 66, 70, 74, 78, 82, 86, 90, 94, 98, 100]
 
 
proc toStandardValue(f: float): StandardValue =
  ## Convert a float to a standard value (decimal value multiplied by 100).
  ## Index: 0.01..0.05 -> 0, 0.06..0.10 -> 1, 0.11..0.15 -> 2...
  var value = int(f * 100)
  if value == 0: return StandardValue(10)
  dec value
  # Increment index every 5 of value, so value in 1..100 translates to index in 0..19.
  let index = 2 * (value div 10) + (value mod 10) div 5
  result = StandardValue(Pricemap[index])
 
 
proc `$`(price: StandardValue): string =
  ## Return the string representation of a standard value.
  if price < StandardValue(10): "0.0" & $int(price)
  elif price < StandardValue(100): "0." & $int(price)
  else: "1.00"
 
 
when isMainModule:
  randomize()
  for _ in 0 .. 10:
    let price = rand(1.01)
    echo &"Price for {price:.2f} is {price.toStandardValue()}"