Я наблюдаю некоторое неожиданное поведение с плавающей запятой в Эликсире.
4.7 / 0.1 = 47.0 (good!)
4.8 / 0.1 = 47.9999999999 (bad!)
4.9 / 0.1 = 49 (good!)
Хотя я понимаю ограничения точности fp, в данном случае ответ просто выглядит неверным.
Любопытно, что я попробовал это и на питоне и получил тот же результат, что еще более загадочно. Когда я изменил формат на 4.8 * (1/0.1), я получил правильный ответ (48,0).
Что здесь происходит?





На самом деле это нормальное поведение для чисел с плавающей запятой IEEE 754, не связанное с erlang/elixir. Python или Nodejs вернут одно и то же.
Для получения дополнительной информации вы можете прочитать это подробное объяснение.
Хотя я понимаю ограничения точности fp
Явно нет :-)
Как всегда, если вам нужна десятичная точность, используйте Decimal:
iex(2)> Decimal.div(Decimal.new("4.8"), Decimal.new("0.1"))
#Decimal<48>
iex(3)> Decimal.mult(Decimal.new("4.8"), Decimal.new("10"))
#Decimal<48.0>