Skip to content
4 changes: 2 additions & 2 deletions mixinnet/number.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ func IntegerFromDecimal(d decimal.Decimal) (v Integer) {
if d.Sign() <= 0 {
panic(d)
}
s := d.Mul(decimal.New(1, Precision)).StringFixed(0)
s := d.Mul(decimal.New(1, Precision)).Floor().String()
v.i.SetString(s, 10)
return
}
Expand All @@ -50,7 +50,7 @@ func IntegerFromString(x string) (v Integer) {
if d.Sign() <= 0 {
panic(x)
}
s := d.Mul(decimal.New(1, Precision)).StringFixed(0)
s := d.Mul(decimal.New(1, Precision)).Floor().String()
v.i.SetString(s, 10)
return
}
Expand Down
75 changes: 75 additions & 0 deletions mixinnet/number_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package mixinnet

import (
"testing"

"github.com/stretchr/testify/require"
)

func TestInteger(t *testing.T) {
require := require.New(t)
require.Equal("0.00000000", NewInteger(0).String())

a := NewInteger(10000)
b := IntegerFromString("10000")
require.Equal(0, a.Cmp(b))

c := a.Add(b)
require.Equal("20000.00000000", c.String())
j, err := c.MarshalJSON()
require.Nil(err)
require.Equal("\"20000.00000000\"", string(j))
err = c.UnmarshalJSON(j)
require.Nil(err)
require.Equal("20000.00000000", c.String())

require.Equal(0, b.Add(a).Cmp(c))
require.Equal(0, c.Sub(a).Cmp(b))
require.Equal(0, c.Sub(b).Cmp(a))

a = IntegerFromString("0.000000001")
require.Equal("0.00000000", a.String())
a = IntegerFromString("10.000000001")
require.Equal("10.00000000", a.String())
a = IntegerFromString("0.00000001")
require.Equal("0.00000001", a.String())
a = IntegerFromString("10.00000001")
require.Equal("10.00000001", a.String())
a = IntegerFromString("0.1")
require.Equal("0.10000000", a.String())

m := NewInteger(500000)
n := m.Div(10)
require.Equal("50000.00000000", n.String())
n = m.Div(1000000)
require.Equal("0.50000000", n.String())
n = n.Div(10000000)
require.Equal("0.00000005", n.String())
require.Equal(1, n.Sign())
n = n.Mul(10).Div(10)
require.Equal("0.00000005", n.String())
require.Equal(1, n.Sign())
n = n.Div(10).Mul(10)
require.Equal("0.00000000", n.String())
require.Equal(0, n.Sign())

m = NewInteger(1)
n = m.Div(3)
require.Equal("0.33333333", n.String())
n = n.Mul(3)
require.Equal("0.99999999", n.String())
n = n.Add(IntegerFromString("0.00000001"))
require.Equal("1.00000000", n.String())

m = NewInteger(8273)
require.Equal("8273.00000000", m.String())

m = IntegerFromString("0.00000192")
require.Equal("0.00000192", m.String())

i0 := IntegerFromString("0.003790547948714634")
require.Equal("0.00379054", i0.String())
i1 := IntegerFromString(i0.String())
require.Equal("0.00379054", i1.String())
require.Equal(i0, i1)
}