-
Notifications
You must be signed in to change notification settings - Fork 3
/
calculate.go
executable file
·89 lines (76 loc) · 1.55 KB
/
calculate.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
// Package floatKit
/*
浮点数的高精度运算.
*/
package floatKit
import (
"github.com/shopspring/decimal"
)
// Add 加
func Add(delta float64, ps ...float64) float64 {
if ps == nil {
return delta
}
tmp := decimal.NewFromFloat(delta)
for _, p := range ps {
tmp = tmp.Add(decimal.NewFromFloat(p))
}
value, _ := tmp.Float64()
return value
}
// Sub 减
func Sub(delta float64, ps ...float64) float64 {
if ps == nil {
return delta
}
tmp := decimal.NewFromFloat(delta)
for _, p := range ps {
tmp = tmp.Sub(decimal.NewFromFloat(p))
}
value, _ := tmp.Float64()
return value
}
// Mul 乘
func Mul(delta float64, ps ...float64) float64 {
if ps == nil {
return delta
}
tmp := decimal.NewFromFloat(delta)
for _, p := range ps {
tmp = tmp.Mul(decimal.NewFromFloat(p))
}
value, _ := tmp.Float64()
return value
}
// Div 除法(不额外处理小数位)
func Div(x float64, y ...float64) float64 {
if y == nil {
return x
}
tmp := decimal.NewFromFloat(x)
for _, p := range y {
tmp = tmp.Div(decimal.NewFromFloat(p))
}
value, _ := tmp.Float64()
return value
}
// DivAndRound 除法(四舍五入),divides and rounds to a given precision
/*
@param places 小数位数
e.g.
(4, 1, 2) => 0.5
(4, 1, 3) => 0.3333
(4, 0.123456) => 0.1235
*/
func DivAndRound(places int32, x float64, y ...float64) float64 {
tmp := decimal.NewFromFloat(x)
if y != nil {
for _, p := range y {
tmp = tmp.Div(decimal.NewFromFloat(p))
}
}
// 相较于 Div,多了这一行
tmp = tmp.Round(places)
value, _ := tmp.Float64()
return value
}