go
/
misc
1
0
Fork 0
misc/nums/big.go

36 lines
1.1 KiB
Go

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
}