Как лучше всего плавать в эликсире? - PullRequest
2 голосов
/ 08 апреля 2019

Я пытаюсь округлить Float в эликсире до 2 десятичных знаков.

Если у меня есть число 12.555, я бы хотел, чтобы моя функция округления возвращала 12.56

Первоначально я думал, что Float.round - это то, что я хотел, но эта функция не всегда возвращает желаемый ответ.

Например ...

iex()> Float.round(12.555, 2)
12.55

Я знаю, что могу сделать это с помощью временной функции, но я подумал, что должно быть лучшее решение.

Мое текущее решение ...

iex()> round(12.555 * 100) / 100
12.56

Это делает работу, но, как я уже сказал, я просто хотел узнать, есть ли лучшее решение.

Заранее спасибо

1 Ответ

3 голосов
/ 09 апреля 2019

Из-за способа работы чисел с плавающей запятой, если вам нужна точность, включая управление алгоритмами округления , вам необходимо использовать библиотеку, такую ​​как Десятичное число :

12.555
|> Decimal.from_float()
|> Decimal.round(2)

Выход:

#Decimal<12.56>

Затем вы можете использовать такие функции, как Decimal.to_string/2 для печати или Decimal.to_float/1, но помните, что to_float/1 также является неточной операцией и может привести к сбою.

...