From f060af2b7d4beb9249de8bc0add72042578a3f7c Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Mon, 4 Dec 2023 14:00:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20maths=20=E6=96=B0=E5=A2=9E=20MakeLastDi?= =?UTF-8?q?gitsZero=20=E5=87=BD=E6=95=B0=EF=BC=8C=E7=94=A8=E4=BA=8E?= =?UTF-8?q?=E5=B0=86=E4=BC=A0=E5=85=A5=E6=95=B0=E5=AD=97=E7=9A=84=E6=9C=AB?= =?UTF-8?q?=E4=BD=8D=20n=20=E4=BD=8D=E8=AE=BE=E7=BD=AE=E4=B8=BA=200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/maths/math.go | 11 +++++++++++ utils/maths/math_test.go | 14 ++++++++++++++ utils/random/number.go | 9 +++++++++ 3 files changed, 34 insertions(+) create mode 100644 utils/maths/math_test.go 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)) }