mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-21 22:43:52 +00:00
FIX: fix format string float point issue
This commit is contained in:
parent
78d65d74d2
commit
36f48bc604
|
@ -115,9 +115,50 @@ func (v Value) FormatString(prec int) string {
|
|||
} else if v == NegInf {
|
||||
return "-inf"
|
||||
}
|
||||
pow := math.Pow10(prec)
|
||||
return strconv.FormatFloat(
|
||||
math.Trunc(float64(v)/DefaultPow*pow)/pow, 'f', prec, 64)
|
||||
|
||||
u := int64(v)
|
||||
|
||||
// trunc precision
|
||||
precDiff := DefaultPrecision - prec
|
||||
if precDiff > 0 {
|
||||
powDiff := int64(math.Pow10(precDiff))
|
||||
u = int64(v) / powDiff * powDiff
|
||||
}
|
||||
|
||||
// check sign
|
||||
sign := Value(u).Sign()
|
||||
|
||||
basePow := int64(DefaultPow)
|
||||
a := u / basePow
|
||||
b := u % basePow
|
||||
|
||||
if a < 0 {
|
||||
a = -a
|
||||
}
|
||||
|
||||
if b < 0 {
|
||||
b = -b
|
||||
}
|
||||
|
||||
str := strconv.FormatInt(a, 10)
|
||||
if prec > 0 {
|
||||
bStr := fmt.Sprintf(".%08d", b)
|
||||
if prec <= DefaultPrecision {
|
||||
bStr = bStr[0 : prec+1]
|
||||
} else {
|
||||
for i := prec - DefaultPrecision; i > 0; i-- {
|
||||
bStr += "0"
|
||||
}
|
||||
}
|
||||
|
||||
str += bStr
|
||||
}
|
||||
|
||||
if sign < 0 {
|
||||
str = "-" + str
|
||||
}
|
||||
|
||||
return str
|
||||
}
|
||||
|
||||
func (v Value) Percentage() string {
|
||||
|
|
59
pkg/fixedpoint/convert_test.go
Normal file
59
pkg/fixedpoint/convert_test.go
Normal file
|
@ -0,0 +1,59 @@
|
|||
package fixedpoint
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func Test_FormatString(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
|
||||
t.Run("Value(57000000) with prec = 5, expected 0.57", func(t *testing.T) {
|
||||
v := Value(57000000)
|
||||
s := v.FormatString(5)
|
||||
assert.Equal("0.57000", s)
|
||||
})
|
||||
|
||||
t.Run("Value(57123456) with prec = 5, expected 0.57123", func(t *testing.T) {
|
||||
v := Value(57123456)
|
||||
s := v.FormatString(5)
|
||||
assert.Equal("0.57123", s)
|
||||
})
|
||||
|
||||
t.Run("Value(123456789) with prec = 9, expected 1.23456789", func(t *testing.T) {
|
||||
v := Value(123456789)
|
||||
s := v.FormatString(9)
|
||||
assert.Equal("1.234567890", s)
|
||||
})
|
||||
|
||||
t.Run("Value(102345678) with prec = 9, expected 1.02345678", func(t *testing.T) {
|
||||
v := Value(102345678)
|
||||
s := v.FormatString(9)
|
||||
assert.Equal("1.023456780", s)
|
||||
})
|
||||
|
||||
t.Run("Value(-57000000) with prec = 5, expected -0.57", func(t *testing.T) {
|
||||
v := Value(-57000000)
|
||||
s := v.FormatString(5)
|
||||
assert.Equal("-0.57000", s)
|
||||
})
|
||||
|
||||
t.Run("Value(-123456789) with prec = 9, expected 1.23456789", func(t *testing.T) {
|
||||
v := Value(-123456789)
|
||||
s := v.FormatString(9)
|
||||
assert.Equal("-1.234567890", s)
|
||||
})
|
||||
|
||||
t.Run("Value(1234567890) with prec = -1, expected 10", func(t *testing.T) {
|
||||
v := Value(1234567890)
|
||||
s := v.FormatString(-1)
|
||||
assert.Equal("10", s)
|
||||
})
|
||||
|
||||
t.Run("Value(-1234) with prec = 3, expected = 0.000", func(t *testing.T) {
|
||||
v := Value(-1234)
|
||||
s := v.FormatString(3)
|
||||
assert.Equal("0.000", s)
|
||||
})
|
||||
}
|
|
@ -113,7 +113,7 @@ func (m Market) FormatPrice(val fixedpoint.Value) string {
|
|||
}
|
||||
|
||||
func FormatPrice(price fixedpoint.Value, tickSize fixedpoint.Value) string {
|
||||
prec := int(math.Round(math.Abs(math.Log10(tickSize.Float64()))))
|
||||
prec := int(math.Round(math.Log10(tickSize.Float64()) * -1.0))
|
||||
return price.FormatString(prec)
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user