Elixir 中的小数四舍五入

アレッ*_*ックス 5 decimal elixir

我有这个十进制数 Elixir:

c1 = Decimal.div(a1, b1)
# => #Decimal<0.006453859622556080696687234694>
Run Code Online (Sandbox Code Playgroud)

如何将其四舍五入为小数点后位数较少的较短数字?

Kel*_*all 5

正如@Dogbert 在评论中所说 - 获取round数字的最简单方法:

iex> alias Decimal, as: D
nil
iex> d = D.div(D.new(1), D.new(3))
#Decimal<0.3333333333333333333333333333>
iex> D.round(d, 5)
#Decimal<0.33333>
Run Code Online (Sandbox Code Playgroud)

编辑:

以下内容并不完全正确!!精度是小数系数中的位数,而不是实际的数字四舍五入。因此,如果您将精度设置为 5,然后对数字进行一些计算,您将只能得到系数总位数等于 5 的数字。例如:

iex> D.set_context(%D.Context{D.get_context | precision: 5})
:ok
iex> a = D.div(D.new(100.12345), D.new(3))
#Decimal<33.374>
Run Code Online (Sandbox Code Playgroud)

我真的很抱歉完全错误的信息!

但是,如果您希望每个操作都四舍五入,那么您可以 Context先设置,设置后,Decimal将在每个操作中使用新设置的精度。

iex> D.set_context(%D.Context{D.get_context | precision: 5})
:ok
iex> a = D.div(D.new(1), D.new(3))
#Decimal<0.33333>
iex> b = D.new("0.006453859622556080696687234694")
#Decimal<0.006453859622556080696687234694>
iex> D.add(a,b)
#Decimal<0.33978>
Run Code Online (Sandbox Code Playgroud)

请注意,解析数字时Decimal.new/1Context考虑。仅当您使用某些操作时它才会使用它 Decimal