Удалить десятичные конечные нули без использования формы scientifi c в Elixir - PullRequest
1 голос
/ 28 мая 2020

Я бы хотел удалить конечные нули из десятичной части и оставить целую часть в нейтральной форме (чтобы не менять ее с 100 на 1e2. Использование Decimal правильно удаляет конечные нули но он также переключается на научную нотацию c.

iex(30)> d = Decimal.new("1.00000")
#Decimal<1.00000>
iex(31)> Decimal.reduce(d)
#Decimal<1>
iex(32)> d = Decimal.new("100.00000")
#Decimal<100.00000>
iex(33)> Decimal.reduce(d)
#Decimal<1E+2>

Ответы [ 2 ]

2 голосов
/ 28 мая 2020
"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

0 голосов
/ 02 июня 2020

From: https://hexdocs.pm/elixir/Kernel.html#trunc / 1

trunc(number)

Specs

trunc(number()) :: integer()

Возвращает целую часть числа.

Разрешено в сторожевые испытания. Встроено компилятором.

Примеры:

iex> trunc(5.4)
> 5

iex> trunc(-5.99)
> -5

iex> trunc(-5)
> -5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...