/
math.go
169 lines (146 loc) · 3.19 KB
/
math.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
package util
import (
"math"
"math/rand"
"strconv"
"time"
"github.com/spf13/cast"
)
//////////// Mathematical Functions ////////////
// Abs abs()
func Abs(number float64) float64 {
return math.Abs(number)
}
// Rand rand()
// Range: [0, 2147483647]
func Rand(min, max int) int {
if min > max {
panic("min: min cannot be greater than max")
}
// PHP: getrandmax()
if int31 := 1<<31 - 1; max > int31 {
panic("max: max can not be greater than " + strconv.Itoa(int31))
}
if min == max {
return min
}
r := rand.New(rand.NewSource(time.Now().UnixNano()))
return r.Intn(max+1-min) + min
}
// Round round()
func Round(value float64, precision int) float64 {
p := math.Pow10(precision)
return math.Trunc((value+0.5/p)*p) / p
}
// Floor floor()
func Floor(value float64) float64 {
return math.Floor(value)
}
// Ceil ceil()
func Ceil(value float64) float64 {
return math.Ceil(value)
}
// Pi pi()
func Pi() float64 {
return math.Pi
}
// Max max()
func Max(nums ...float64) float64 {
if len(nums) < 2 {
panic("nums: the nums length is less than 2")
}
max := nums[0]
for i := 1; i < len(nums); i++ {
max = math.Max(max, nums[i])
}
return max
}
// Min min()
func Min(nums ...float64) float64 {
if len(nums) < 2 {
panic("nums: the nums length is less than 2")
}
min := nums[0]
for i := 1; i < len(nums); i++ {
min = math.Min(min, nums[i])
}
return min
}
// DecBin Decbin decbin()
func DecBin(number int64) string {
return strconv.FormatInt(number, 2)
}
// BinDec Bindec bindec()
func BinDec(str string) (string, error) {
i, err := strconv.ParseInt(str, 2, 0)
if err != nil {
return "", err
}
return strconv.FormatInt(i, 10), nil
}
// Hex2bin hex2bin()
func Hex2bin(data string) (string, error) {
i, err := strconv.ParseInt(data, 16, 0)
if err != nil {
return "", err
}
return strconv.FormatInt(i, 2), nil
}
// Bin2hex bin2hex()
func Bin2hex(str string) (string, error) {
i, err := strconv.ParseInt(str, 2, 0)
if err != nil {
// If input is not binary number
if err.(*strconv.NumError).Err == strconv.ErrSyntax {
byteArray := []byte(str)
var out string
for i := 0; i < len(byteArray); i++ {
out += strconv.FormatInt(int64(byteArray[i]), 16)
}
return out, nil
} else {
return "", err
}
}
return strconv.FormatInt(i, 16), nil
}
// Dechex dechex()
func Dechex(number int64) string {
return strconv.FormatInt(number, 16)
}
// Hexdec hexdec()
func Hexdec(str string) (int64, error) {
return strconv.ParseInt(str, 16, 0)
}
// Decoct decoct()
func Decoct(number int64) string {
return strconv.FormatInt(number, 8)
}
// Octdec Octdec()
func Octdec(str string) (int64, error) {
return strconv.ParseInt(str, 8, 0)
}
// BaseConvert base_convert()
func BaseConvert(number string, frombase, tobase int) (string, error) {
i, err := strconv.ParseInt(number, frombase, 0)
if err != nil {
return "", err
}
return strconv.FormatInt(i, tobase), nil
}
// IsNan is_nan()
func IsNan(val float64) bool {
return math.IsNaN(val)
}
// Divide 查询是否被整除
func Divide(m, n interface{}) bool {
r := math.Mod(cast.ToFloat64(m), cast.ToFloat64(n))
if r == 0 {
return true
}
return false
}
// Add ...
func Add(m, n interface{}) int {
return cast.ToInt(m) + cast.ToInt(n)
}