forked from Rhymond/go-money
-
Notifications
You must be signed in to change notification settings - Fork 0
/
calculator.go
73 lines (54 loc) · 1020 Bytes
/
calculator.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
package money
import "math"
type calculator struct{}
func (c *calculator) add(a, b Amount) Amount {
return a + b
}
func (c *calculator) subtract(a, b Amount) Amount {
return a - b
}
func (c *calculator) multiply(a Amount, m int64) Amount {
return a * m
}
func (c *calculator) divide(a Amount, d int64) Amount {
return a / d
}
func (c *calculator) modulus(a Amount, d int64) Amount {
return a % d
}
func (c *calculator) allocate(a Amount, r, s uint) Amount {
if a == 0 || s == 0 {
return 0
}
return a * int64(r) / int64(s)
}
func (c *calculator) absolute(a Amount) Amount {
if a < 0 {
return -a
}
return a
}
func (c *calculator) negative(a Amount) Amount {
if a > 0 {
return -a
}
return a
}
func (c *calculator) round(a Amount, e int) Amount {
if a == 0 {
return 0
}
absam := c.absolute(a)
exp := int64(math.Pow(10, float64(e)))
m := absam % exp
if m > (exp / 2) {
absam += exp
}
absam = (absam / exp) * exp
if a < 0 {
a = -absam
} else {
a = absam
}
return a
}