diff --git a/internal/utils/numberutils/utils.go b/internal/utils/numberutils/utils.go index b19ae020..411d6b39 100644 --- a/internal/utils/numberutils/utils.go +++ b/internal/utils/numberutils/utils.go @@ -1,7 +1,10 @@ package numberutils import ( + "fmt" + "github.com/iwind/TeaGo/types" "strconv" + "strings" ) func FormatInt64(value int64) string { @@ -43,18 +46,19 @@ func Min[T int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | } func FloorFloat32(f float32, decimal int) float32 { - if decimal < 0 { - decimal = 0 + if decimal <= 0 { + return f } - for i := 0; i < decimal; i++ { - f *= 10 + var s = fmt.Sprintf("%f", f) + var index = strings.Index(s, ".") + if index < 0 { + return f } - f = float32(int64(f)) - - for i := 0; i < decimal; i++ { - f /= 10 + var d = s[index:] + if len(d) <= decimal+1 { + return f } - return f + return types.Float32(s[:index] + d[:decimal+1]) } diff --git a/internal/utils/numberutils/utils_test.go b/internal/utils/numberutils/utils_test.go index 0815ba04..557b990b 100644 --- a/internal/utils/numberutils/utils_test.go +++ b/internal/utils/numberutils/utils_test.go @@ -27,8 +27,11 @@ func TestMaxFloat32(t *testing.T) { func TestFloorFloat32(t *testing.T) { t.Logf("%f", numberutils.FloorFloat32(123.456, -1)) t.Logf("%f", numberutils.FloorFloat32(123.456, 0)) + t.Logf("%f", numberutils.FloorFloat32(123, 2)) t.Logf("%f, %f", numberutils.FloorFloat32(123.456, 1), 123.456*10) t.Logf("%f, %f", numberutils.FloorFloat32(123.456, 2), 123.456*10*10) t.Logf("%f, %f", numberutils.FloorFloat32(123.456, 3), 123.456*10*10*10) t.Logf("%f, %f", numberutils.FloorFloat32(123.456, 4), 123.456*10*10*10*10) + t.Logf("%f, %f", numberutils.FloorFloat32(123.456789, 4), 123.456789*10*10*10*10) + t.Logf("%f", numberutils.FloorFloat32(-123.45678, 2)) }