Packages
tai
0.0.52
0.0.75
0.0.74
0.0.73
0.0.72
0.0.71
0.0.70
0.0.69
0.0.68
0.0.67
0.0.66
0.0.65
0.0.64
0.0.63
0.0.62
0.0.61
0.0.60
0.0.59
0.0.58
0.0.57
0.0.56
0.0.55
0.0.54
0.0.53
0.0.52
0.0.51
0.0.50
0.0.49
0.0.48
0.0.47
0.0.46
0.0.45
0.0.44
0.0.43
0.0.42
0.0.41
0.0.40
0.0.39
0.0.38
0.0.37
0.0.36
0.0.35
0.0.34
0.0.33
0.0.32
0.0.31
0.0.30
0.0.29
0.0.28
0.0.27
0.0.26
0.0.25
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
A composable, real time, market data and trade execution toolkit
Current section
Files
Jump to
Current section
Files
lib/tai/utils/decimal.ex
defmodule Tai.Utils.Decimal do
@spec round_up(Decimal.t(), Decimal.t()) :: Decimal.t()
def round_up(val, increment) do
{vc, ic, e} = same_order_of(val, increment)
r = rem(vc, ic)
if val.sign == 1 and r > 0 do
v = vc + (ic - r)
Decimal.new(val.sign, v, e)
else
v = vc - r
Decimal.new(val.sign, v, e)
end
end
@spec round_down(Decimal.t(), Decimal.t()) :: Decimal.t()
def round_down(val, increment) do
{vc, ic, e} = same_order_of(val, increment)
r = rem(vc, ic)
if val.sign == 1 or r == 0 do
v = vc - r
Decimal.new(val.sign, v, e)
else
v = vc + (ic - r)
Decimal.new(val.sign, v, e)
end
end
defp same_order_of(val, increment) do
cond do
val.exp < increment.exp ->
s = abs(val.exp - increment.exp)
ic = trunc(Tai.Utils.Math.pow(10, s)) * increment.coef
{val.coef, ic, val.exp}
increment.exp < val.exp ->
s = abs(increment.exp - val.exp)
vc = trunc(Tai.Utils.Math.pow(10, s)) * val.coef
{vc, increment.coef, increment.exp}
true ->
{val.coef, increment.coef, val.exp}
end
end
end