diff --git a/utils/maths/math.go b/utils/maths/math.go index 441f23c..6166c87 100644 --- a/utils/maths/math.go +++ b/utils/maths/math.go @@ -204,3 +204,14 @@ func IsOdd[V generic.Integer](n V) bool { func IsEven[V generic.Integer](n V) bool { return 0 == (int64(n) & 1) } + +// MakeLastDigitsZero 返回一个新的数,其中 num 的最后 digits 位数被设为零。 +// - 函数首先创建一个 10 的 digits 次方的遮罩,然后通过整除和乘以这个遮罩来使 num 的最后 digits 位归零。 +// - 当 T 类型为浮点型时,将被向下取整后再进行转换 +func MakeLastDigitsZero[T generic.Number](num T, digits int) T { + var mask int64 = 1 + for i := 0; i < digits; i++ { + mask *= 10 + } + return T(int64(num) / mask * mask) +} diff --git a/utils/maths/math_test.go b/utils/maths/math_test.go new file mode 100644 index 0000000..1e2893d --- /dev/null +++ b/utils/maths/math_test.go @@ -0,0 +1,14 @@ +package maths_test + +import ( + "github.com/kercylan98/minotaur/utils/maths" + "github.com/kercylan98/minotaur/utils/random" + "testing" +) + +func TestMakeLastDigitsZero(t *testing.T) { + for i := 0; i < 20; i++ { + n := float64(random.Int64(100, 999999)) + t.Log(n, 3, maths.MakeLastDigitsZero(n, 3)) + } +} diff --git a/utils/random/number.go b/utils/random/number.go index fd9c54b..2a42e4a 100644 --- a/utils/random/number.go +++ b/utils/random/number.go @@ -7,16 +7,25 @@ import ( // Int64 返回一个介于min和max之间的int64类型的随机数。 func Int64(min int64, max int64) int64 { + if min == max { + return min + } return min + rand.Int63n(max+1-min) } // Int 返回一个介于min和max之间的的int类型的随机数。 func Int(min int, max int) int { + if min == max { + return min + } return int(Int64(int64(min), int64(max))) } // Duration 返回一个介于min和max之间的的Duration类型的随机数。 func Duration(min int64, max int64) time.Duration { + if min == max { + return time.Duration(min) + } return time.Duration(Int64(min, max)) }