"100.00000"
|> Decimal.new()
|> Decimal.round(0)
|> Decimal.to_integer
|> Decimal.new()
равно
#Decimal<100>
Думаю, вам следует выбрать именно этот путь. Однако представление десятичной дроби на самом деле не имеет значения, я считаю, что это все тот же формат при хранении. Если это не о читабельности?
После некоторого дальнейшего исследования я заметил, что представление не то же самое. Обратите внимание на следующее.
iex(35)> x = "100.0000000" |> Decimal.new() |> Decimal.round(0) |> Decimal.to_integer |> Decimal.new()
#Decimal<100>
x
внутренне представлено как %Decimal{sign: 1, coef: 100, exp: 0}
. Это в научной c нотации 100 * 10^0
(т.е. 100 * 1
).
Но если мы просто используем функцию reduce/1
, она будет представлена по-другому:
iex(50)> y = Decimal.new("100.0000000") |> Decimal.reduce()
#Decimal<1E+2>
y
отображается как %Decimal{sign: 1, coef: 1, exp: 2}
. Это в научной c нотации 1 * 10^2
(т.е. 1 * 100
).
Эти значения точно такие же, но представлены по-разному и не равны в терминах ==
. Они идентичны с использованием Decimal.equal?/2
.
iex(64)> x == y
false
iex(65)> Decimal.equal?(x, y)
true
Окончательное обновление: если речь идет о представлении в текстовой форме, вы всегда можете использовать функцию to_string/2
и указать ей вывод "нормального" представления.
iex(68)> y |> Decimal.to_string(:normal)
"100"
iex(69)> x |> Decimal.to_string(:normal)
"100"
Здесь перечислены все варианты: https://hexdocs.pm/decimal/Decimal.html#to_string / 2