/
big.go
35 lines (30 loc) · 1.09 KB
/
big.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
package nums
import (
"github.com/ericlagergren/decimal"
)
// BigSeperateFractionalPotions decompose a decimal number with a sign, integer, and fractional parts.
func BigSeperateFractionalPotions(src *decimal.Big) (sign bool, integer, fractional uint64, fractionalLength uint8) {
var num, integerPart decimal.Big
num.Copy(src)
num.Context.RoundingMode = decimal.ToZero
sign = num.Signbit()
integer, _ = num.Abs(&num).Uint64()
integerPart.SetUint64(integer)
scale := num.Sub(&num, &integerPart).Quantize(6).Reduce().Scale()
fractional, _ = num.Mul(&num, decimal.New(1, -scale)).Reduce().Uint64()
fractionalLength = uint8(scale)
return
}
// BigMergeFractionalPotions compose a decimal number with a sign, integer, and fractional parts.
func BigMergeFractionalPotions(sign bool, integer, fractional uint64, fractionalLength uint8) (dst *decimal.Big) {
var num, frac decimal.Big
num.SetUint64(integer)
frac.SetUint64(fractional)
dst = &num
num.Mul(&num, decimal.New(1, -int(fractionalLength))).Add(&num, &frac).SetScale(int(fractionalLength))
if sign {
num.Neg(&num)
}
num.Reduce()
return
}