Commit 17916dfe authored by aliiohs's avatar aliiohs

change name from BigDecimal to Decimal

parent 73462bb7
...@@ -113,7 +113,7 @@ var ( ...@@ -113,7 +113,7 @@ var (
999999900, 999999900,
999999990, 999999990,
} }
zeroBigDecimal = BigDecimal{} zeroBigDecimal = Decimal{}
) )
// add adds a and b and carry, returns the sum and new carry. // add adds a and b and carry, returns the sum and new carry.
...@@ -223,11 +223,11 @@ func digitsToWords(digits int) int { ...@@ -223,11 +223,11 @@ func digitsToWords(digits int) int {
return (digits + digitsPerWord - 1) / digitsPerWord return (digits + digitsPerWord - 1) / digitsPerWord
} }
// BigDecimalStructSize is the struct size of BigDecimal. // BigDecimalStructSize is the struct size of Decimal.
const BigDecimalStructSize = 40 const BigDecimalStructSize = 40
// BigDecimal represents a decimal value. // Decimal represents a decimal value.
type BigDecimal struct { type Decimal struct {
digitsInt int8 // the number of *decimal* digits before the point. digitsInt int8 // the number of *decimal* digits before the point.
digitsFrac int8 // the number of decimal digits after the point. digitsFrac int8 // the number of decimal digits after the point.
...@@ -239,32 +239,39 @@ type BigDecimal struct { ...@@ -239,32 +239,39 @@ type BigDecimal struct {
// wordBuf is an array of int32 words. // wordBuf is an array of int32 words.
// A word is an int32 value can hold 9 digits.(0 <= word < wordBase) // A word is an int32 value can hold 9 digits.(0 <= word < wordBase)
wordBuf [maxWordBufLen]int32 wordBuf [maxWordBufLen]int32
// for hessian
Value string
}
func (Decimal) JavaClassName() string {
return "java.math.BigDecimal"
} }
// IsNegative returns whether a decimal is negative. // IsNegative returns whether a decimal is negative.
func (d *BigDecimal) IsNegative() bool { func (d *Decimal) IsNegative() bool {
return d.negative return d.negative
} }
// GetDigitsFrac returns the digitsFrac. // GetDigitsFrac returns the digitsFrac.
func (d *BigDecimal) GetDigitsFrac() int8 { func (d *Decimal) GetDigitsFrac() int8 {
return d.digitsFrac return d.digitsFrac
} }
// String returns the decimal string representation rounded to resultFrac. // String returns the decimal string representation rounded to resultFrac.
func (d *BigDecimal) String() string { func (d *Decimal) String() string {
tmp := *d tmp := *d
_ = tmp.Round(&tmp, int(tmp.resultFrac), ModeHalfEven) _ = tmp.Round(&tmp, int(tmp.resultFrac), ModeHalfEven)
//todo terror.Log(errors.Trace(err)) //todo terror.Log(errors.Trace(err))
return string(tmp.ToString()) return string(tmp.ToString())
} }
func (d *BigDecimal) stringSize() int { func (d *Decimal) stringSize() int {
// sign, zero integer and dot. // sign, zero integer and dot.
return int(d.digitsInt + d.digitsFrac + 3) return int(d.digitsInt + d.digitsFrac + 3)
} }
func (d *BigDecimal) removeLeadingZeros() (wordIdx int, digitsInt int) { func (d *Decimal) removeLeadingZeros() (wordIdx int, digitsInt int) {
digitsInt = int(d.digitsInt) digitsInt = int(d.digitsInt)
i := ((digitsInt - 1) % digitsPerWord) + 1 i := ((digitsInt - 1) % digitsPerWord) + 1
for digitsInt > 0 && d.wordBuf[wordIdx] == 0 { for digitsInt > 0 && d.wordBuf[wordIdx] == 0 {
...@@ -280,7 +287,7 @@ func (d *BigDecimal) removeLeadingZeros() (wordIdx int, digitsInt int) { ...@@ -280,7 +287,7 @@ func (d *BigDecimal) removeLeadingZeros() (wordIdx int, digitsInt int) {
return return
} }
func (d *BigDecimal) removeTrailingZeros() (lastWordIdx int, digitsFrac int) { func (d *Decimal) removeTrailingZeros() (lastWordIdx int, digitsFrac int) {
digitsFrac = int(d.digitsFrac) digitsFrac = int(d.digitsFrac)
i := ((digitsFrac - 1) % digitsPerWord) + 1 i := ((digitsFrac - 1) % digitsPerWord) + 1
lastWordIdx = digitsToWords(int(d.digitsInt)) + digitsToWords(int(d.digitsFrac)) lastWordIdx = digitsToWords(int(d.digitsInt)) + digitsToWords(int(d.digitsFrac))
...@@ -304,7 +311,7 @@ func (d *BigDecimal) removeTrailingZeros() (lastWordIdx int, digitsFrac int) { ...@@ -304,7 +311,7 @@ func (d *BigDecimal) removeTrailingZeros() (lastWordIdx int, digitsFrac int) {
// str - result string // str - result string
// errCode - eDecOK/eDecTruncate/eDecOverflow // errCode - eDecOK/eDecTruncate/eDecOverflow
// //
func (d *BigDecimal) ToString() (str []byte) { func (d *Decimal) ToString() (str []byte) {
str = make([]byte, d.stringSize()) str = make([]byte, d.stringSize())
digitsFrac := int(d.digitsFrac) digitsFrac := int(d.digitsFrac)
wordStartIdx, digitsInt := d.removeLeadingZeros() wordStartIdx, digitsInt := d.removeLeadingZeros()
...@@ -382,7 +389,7 @@ func (d *BigDecimal) ToString() (str []byte) { ...@@ -382,7 +389,7 @@ func (d *BigDecimal) ToString() (str []byte) {
} }
// FromString parses decimal from string. // FromString parses decimal from string.
func (d *BigDecimal) FromString(str []byte) error { func (d *Decimal) FromString(str []byte) error {
for i := 0; i < len(str); i++ { for i := 0; i < len(str); i++ {
if !isSpace(str[i]) { if !isSpace(str[i]) {
str = str[i:] str = str[i:]
...@@ -524,7 +531,7 @@ func (d *BigDecimal) FromString(str []byte) error { ...@@ -524,7 +531,7 @@ func (d *BigDecimal) FromString(str []byte) error {
// eDecOverflow operation lead to overflow, number is untoched // eDecOverflow operation lead to overflow, number is untoched
// eDecTruncated number was rounded to fit into buffer // eDecTruncated number was rounded to fit into buffer
// //
func (d *BigDecimal) Shift(shift int) error { func (d *Decimal) Shift(shift int) error {
var err error var err error
if shift == 0 { if shift == 0 {
return nil return nil
...@@ -688,7 +695,7 @@ func (d *BigDecimal) Shift(shift int) error { ...@@ -688,7 +695,7 @@ func (d *BigDecimal) Shift(shift int) error {
start - index (from 0 ) of first decimal digits. start - index (from 0 ) of first decimal digits.
end - index of position just after last decimal digit. end - index of position just after last decimal digit.
*/ */
func (d *BigDecimal) digitBounds() (start, end int) { func (d *Decimal) digitBounds() (start, end int) {
var i int var i int
bufBeg := 0 bufBeg := 0
bufLen := digitsToWords(int(d.digitsInt)) + digitsToWords(int(d.digitsFrac)) bufLen := digitsToWords(int(d.digitsInt)) + digitsToWords(int(d.digitsFrac))
...@@ -741,7 +748,7 @@ func (d *BigDecimal) digitBounds() (start, end int) { ...@@ -741,7 +748,7 @@ func (d *BigDecimal) digitBounds() (start, end int) {
Result fitting in the buffer should be garanted. Result fitting in the buffer should be garanted.
'shift' have to be from 1 to digitsPerWord-1 (inclusive) 'shift' have to be from 1 to digitsPerWord-1 (inclusive)
*/ */
func (d *BigDecimal) doMiniLeftShift(shift, beg, end int) { func (d *Decimal) doMiniLeftShift(shift, beg, end int) {
bufFrom := beg / digitsPerWord bufFrom := beg / digitsPerWord
bufEnd := (end - 1) / digitsPerWord bufEnd := (end - 1) / digitsPerWord
cShift := digitsPerWord - shift cShift := digitsPerWord - shift
...@@ -765,7 +772,7 @@ func (d *BigDecimal) doMiniLeftShift(shift, beg, end int) { ...@@ -765,7 +772,7 @@ func (d *BigDecimal) doMiniLeftShift(shift, beg, end int) {
Result fitting in the buffer should be garanted. Result fitting in the buffer should be garanted.
'shift' have to be from 1 to digitsPerWord-1 (inclusive) 'shift' have to be from 1 to digitsPerWord-1 (inclusive)
*/ */
func (d *BigDecimal) doMiniRightShift(shift, beg, end int) { func (d *Decimal) doMiniRightShift(shift, beg, end int) {
bufFrom := (end - 1) / digitsPerWord bufFrom := (end - 1) / digitsPerWord
bufEnd := beg / digitsPerWord bufEnd := beg / digitsPerWord
cShift := digitsPerWord - shift cShift := digitsPerWord - shift
...@@ -793,7 +800,7 @@ func (d *BigDecimal) doMiniRightShift(shift, beg, end int) { ...@@ -793,7 +800,7 @@ func (d *BigDecimal) doMiniRightShift(shift, beg, end int) {
// //
// RETURN VALUE // RETURN VALUE
// eDecOK/eDecTruncated // eDecOK/eDecTruncated
func (d *BigDecimal) Round(to *BigDecimal, frac int, roundMode RoundMode) (err error) { func (d *Decimal) Round(to *Decimal, frac int, roundMode RoundMode) (err error) {
// wordsFracTo is the number of fraction words in buffer. // wordsFracTo is the number of fraction words in buffer.
wordsFracTo := (frac + 1) / digitsPerWord wordsFracTo := (frac + 1) / digitsPerWord
if frac > 0 { if frac > 0 {
...@@ -968,7 +975,7 @@ func (d *BigDecimal) Round(to *BigDecimal, frac int, roundMode RoundMode) (err e ...@@ -968,7 +975,7 @@ func (d *BigDecimal) Round(to *BigDecimal, frac int, roundMode RoundMode) (err e
} }
// FromInt sets the decimal value from int64. // FromInt sets the decimal value from int64.
func (d *BigDecimal) FromInt(val int64) *BigDecimal { func (d *Decimal) FromInt(val int64) *Decimal {
var uVal uint64 var uVal uint64
if val < 0 { if val < 0 {
d.negative = true d.negative = true
...@@ -980,7 +987,7 @@ func (d *BigDecimal) FromInt(val int64) *BigDecimal { ...@@ -980,7 +987,7 @@ func (d *BigDecimal) FromInt(val int64) *BigDecimal {
} }
// FromUint sets the decimal value from uint64. // FromUint sets the decimal value from uint64.
func (d *BigDecimal) FromUint(val uint64) *BigDecimal { func (d *Decimal) FromUint(val uint64) *Decimal {
x := val x := val
wordIdx := 1 wordIdx := 1
for x >= wordBase { for x >= wordBase {
...@@ -1000,7 +1007,7 @@ func (d *BigDecimal) FromUint(val uint64) *BigDecimal { ...@@ -1000,7 +1007,7 @@ func (d *BigDecimal) FromUint(val uint64) *BigDecimal {
} }
// ToInt returns int part of the decimal, returns the result and errcode. // ToInt returns int part of the decimal, returns the result and errcode.
func (d *BigDecimal) ToInt() (int64, error) { func (d *Decimal) ToInt() (int64, error) {
var x int64 var x int64
wordIdx := 0 wordIdx := 0
for i := d.digitsInt; i > 0; i -= digitsPerWord { for i := d.digitsInt; i > 0; i -= digitsPerWord {
...@@ -1041,7 +1048,7 @@ func (d *BigDecimal) ToInt() (int64, error) { ...@@ -1041,7 +1048,7 @@ func (d *BigDecimal) ToInt() (int64, error) {
} }
// ToUint returns int part of the decimal, returns the result and errcode. // ToUint returns int part of the decimal, returns the result and errcode.
func (d *BigDecimal) ToUint() (uint64, error) { func (d *Decimal) ToUint() (uint64, error) {
if d.negative { if d.negative {
return 0, ErrOverflow return 0, ErrOverflow
} }
...@@ -1065,13 +1072,13 @@ func (d *BigDecimal) ToUint() (uint64, error) { ...@@ -1065,13 +1072,13 @@ func (d *BigDecimal) ToUint() (uint64, error) {
} }
// FromFloat64 creates a decimal from float64 value. // FromFloat64 creates a decimal from float64 value.
func (d *BigDecimal) FromFloat64(f float64) error { func (d *Decimal) FromFloat64(f float64) error {
s := strconv.FormatFloat(f, 'g', -1, 64) s := strconv.FormatFloat(f, 'g', -1, 64)
return d.FromString([]byte(s)) return d.FromString([]byte(s))
} }
// ToFloat64 converts decimal to float64 value. // ToFloat64 converts decimal to float64 value.
func (d *BigDecimal) ToFloat64() (float64, error) { func (d *Decimal) ToFloat64() (float64, error) {
f, err := strconv.ParseFloat(d.String(), 64) f, err := strconv.ParseFloat(d.String(), 64)
if err != nil { if err != nil {
err = ErrOverflow err = ErrOverflow
...@@ -1157,7 +1164,7 @@ with the correct -1/0/+1 result ...@@ -1157,7 +1164,7 @@ with the correct -1/0/+1 result
7E F2 04 C7 2D FB 2D 7E F2 04 C7 2D FB 2D
*/ */
func (d *BigDecimal) ToBin(precision, frac int) ([]byte, error) { func (d *Decimal) ToBin(precision, frac int) ([]byte, error) {
if precision > digitsPerWord*maxWordBufLen || precision < 0 || frac > maxDecimalScale || frac < 0 { if precision > digitsPerWord*maxWordBufLen || precision < 0 || frac > maxDecimalScale || frac < 0 {
return nil, ErrBadNumber return nil, ErrBadNumber
} }
...@@ -1269,7 +1276,7 @@ func (d *BigDecimal) ToBin(precision, frac int) ([]byte, error) { ...@@ -1269,7 +1276,7 @@ func (d *BigDecimal) ToBin(precision, frac int) ([]byte, error) {
// ToHashKey removes the leading and trailing zeros and generates a hash key. // ToHashKey removes the leading and trailing zeros and generates a hash key.
// Two Decimals dec0 and dec1 with different fraction will generate the same hash keys if dec0.Compare(dec1) == 0. // Two Decimals dec0 and dec1 with different fraction will generate the same hash keys if dec0.Compare(dec1) == 0.
func (d *BigDecimal) ToHashKey() ([]byte, error) { func (d *Decimal) ToHashKey() ([]byte, error) {
_, digitsInt := d.removeLeadingZeros() _, digitsInt := d.removeLeadingZeros()
_, digitsFrac := d.removeTrailingZeros() _, digitsFrac := d.removeTrailingZeros()
prec := digitsInt + digitsFrac prec := digitsInt + digitsFrac
...@@ -1288,7 +1295,7 @@ func (d *BigDecimal) ToHashKey() ([]byte, error) { ...@@ -1288,7 +1295,7 @@ func (d *BigDecimal) ToHashKey() ([]byte, error) {
} }
// PrecisionAndFrac returns the internal precision and frac number. // PrecisionAndFrac returns the internal precision and frac number.
func (d *BigDecimal) PrecisionAndFrac() (precision, frac int) { func (d *Decimal) PrecisionAndFrac() (precision, frac int) {
frac = int(d.digitsFrac) frac = int(d.digitsFrac)
_, digitsInt := d.removeLeadingZeros() _, digitsInt := d.removeLeadingZeros()
precision = digitsInt + frac precision = digitsInt + frac
...@@ -1299,7 +1306,7 @@ func (d *BigDecimal) PrecisionAndFrac() (precision, frac int) { ...@@ -1299,7 +1306,7 @@ func (d *BigDecimal) PrecisionAndFrac() (precision, frac int) {
} }
// IsZero checks whether it's a zero decimal. // IsZero checks whether it's a zero decimal.
func (d *BigDecimal) IsZero() bool { func (d *Decimal) IsZero() bool {
isZero := true isZero := true
for _, val := range d.wordBuf { for _, val := range d.wordBuf {
if val != 0 { if val != 0 {
...@@ -1311,7 +1318,7 @@ func (d *BigDecimal) IsZero() bool { ...@@ -1311,7 +1318,7 @@ func (d *BigDecimal) IsZero() bool {
} }
// FromBin Restores decimal from its binary fixed-length representation. // FromBin Restores decimal from its binary fixed-length representation.
func (d *BigDecimal) FromBin(bin []byte, precision, frac int) (binSize int, err error) { func (d *Decimal) FromBin(bin []byte, precision, frac int) (binSize int, err error) {
if len(bin) == 0 { if len(bin) == 0 {
*d = zeroBigDecimal *d = zeroBigDecimal
return 0, ErrBadNumber return 0, ErrBadNumber
...@@ -1460,7 +1467,7 @@ func writeWord(b []byte, word int32, size int) { ...@@ -1460,7 +1467,7 @@ func writeWord(b []byte, word int32, size int) {
} }
// Compare compares one decimal to another, returns -1/0/1. // Compare compares one decimal to another, returns -1/0/1.
func (d *BigDecimal) Compare(to *BigDecimal) int { func (d *Decimal) Compare(to *Decimal) int {
if d.negative == to.negative { if d.negative == to.negative {
cmp, _ := doSub(d, to, nil) cmp, _ := doSub(d, to, nil)
//todo terror.Log(errors.Trace(err)) //todo terror.Log(errors.Trace(err))
...@@ -1473,7 +1480,7 @@ func (d *BigDecimal) Compare(to *BigDecimal) int { ...@@ -1473,7 +1480,7 @@ func (d *BigDecimal) Compare(to *BigDecimal) int {
} }
// DecimalNeg reverses decimal's sign. // DecimalNeg reverses decimal's sign.
func DecimalNeg(from *BigDecimal) *BigDecimal { func DecimalNeg(from *Decimal) *Decimal {
to := *from to := *from
if from.IsZero() { if from.IsZero() {
return &to return &to
...@@ -1485,7 +1492,7 @@ func DecimalNeg(from *BigDecimal) *BigDecimal { ...@@ -1485,7 +1492,7 @@ func DecimalNeg(from *BigDecimal) *BigDecimal {
// DecimalAdd adds two decimals, sets the result to 'to'. // DecimalAdd adds two decimals, sets the result to 'to'.
// Note: DO NOT use `from1` or `from2` as `to` since the metadata // Note: DO NOT use `from1` or `from2` as `to` since the metadata
// of `to` may be changed during evaluating. // of `to` may be changed during evaluating.
func DecimalAdd(from1, from2, to *BigDecimal) error { func DecimalAdd(from1, from2, to *Decimal) error {
to.resultFrac = myMaxInt8(from1.resultFrac, from2.resultFrac) to.resultFrac = myMaxInt8(from1.resultFrac, from2.resultFrac)
if from1.negative == from2.negative { if from1.negative == from2.negative {
return doAdd(from1, from2, to) return doAdd(from1, from2, to)
...@@ -1495,7 +1502,7 @@ func DecimalAdd(from1, from2, to *BigDecimal) error { ...@@ -1495,7 +1502,7 @@ func DecimalAdd(from1, from2, to *BigDecimal) error {
} }
// DecimalSub subs one decimal from another, sets the result to 'to'. // DecimalSub subs one decimal from another, sets the result to 'to'.
func DecimalSub(from1, from2, to *BigDecimal) error { func DecimalSub(from1, from2, to *Decimal) error {
to.resultFrac = myMaxInt8(from1.resultFrac, from2.resultFrac) to.resultFrac = myMaxInt8(from1.resultFrac, from2.resultFrac)
if from1.negative == from2.negative { if from1.negative == from2.negative {
_, err := doSub(from1, from2, to) _, err := doSub(from1, from2, to)
...@@ -1504,7 +1511,7 @@ func DecimalSub(from1, from2, to *BigDecimal) error { ...@@ -1504,7 +1511,7 @@ func DecimalSub(from1, from2, to *BigDecimal) error {
return doAdd(from1, from2, to) return doAdd(from1, from2, to)
} }
func doSub(from1, from2, to *BigDecimal) (cmp int, err error) { func doSub(from1, from2, to *Decimal) (cmp int, err error) {
var ( var (
wordsInt1 = digitsToWords(int(from1.digitsInt)) wordsInt1 = digitsToWords(int(from1.digitsInt))
wordsFrac1 = digitsToWords(int(from1.digitsFrac)) wordsFrac1 = digitsToWords(int(from1.digitsFrac))
...@@ -1669,7 +1676,7 @@ func doSub(from1, from2, to *BigDecimal) (cmp int, err error) { ...@@ -1669,7 +1676,7 @@ func doSub(from1, from2, to *BigDecimal) (cmp int, err error) {
return 0, err return 0, err
} }
func doAdd(from1, from2, to *BigDecimal) error { func doAdd(from1, from2, to *Decimal) error {
var ( var (
err error err error
wordsInt1 = digitsToWords(int(from1.digitsInt)) wordsInt1 = digitsToWords(int(from1.digitsInt))
...@@ -1775,7 +1782,7 @@ func doAdd(from1, from2, to *BigDecimal) error { ...@@ -1775,7 +1782,7 @@ func doAdd(from1, from2, to *BigDecimal) error {
return err return err
} }
func maxDecimal(precision, frac int, to *BigDecimal) { func maxDecimal(precision, frac int, to *Decimal) {
digitsInt := precision - frac digitsInt := precision - frac
to.negative = false to.negative = false
to.digitsInt = int8(digitsInt) to.digitsInt = int8(digitsInt)
...@@ -1823,7 +1830,7 @@ DecimalMul multiplies two decimals. ...@@ -1823,7 +1830,7 @@ DecimalMul multiplies two decimals.
XXX if this library is to be used with huge numbers of thousands of XXX if this library is to be used with huge numbers of thousands of
digits, fast multiplication must be implemented. digits, fast multiplication must be implemented.
*/ */
func DecimalMul(from1, from2, to *BigDecimal) error { func DecimalMul(from1, from2, to *Decimal) error {
var ( var (
err error err error
wordsInt1 = digitsToWords(int(from1.digitsInt)) wordsInt1 = digitsToWords(int(from1.digitsInt))
...@@ -1951,7 +1958,7 @@ func DecimalMul(from1, from2, to *BigDecimal) error { ...@@ -1951,7 +1958,7 @@ func DecimalMul(from1, from2, to *BigDecimal) error {
// from2 - divisor // from2 - divisor
// to - quotient // to - quotient
// fracIncr - increment of fraction // fracIncr - increment of fraction
func DecimalDiv(from1, from2, to *BigDecimal, fracIncr int) error { func DecimalDiv(from1, from2, to *Decimal, fracIncr int) error {
to.resultFrac = myMinInt8(from1.resultFrac+int8(fracIncr), maxDecimalScale) to.resultFrac = myMinInt8(from1.resultFrac+int8(fracIncr), maxDecimalScale)
return doDivMod(from1, from2, to, nil, fracIncr) return doDivMod(from1, from2, to, nil, fracIncr)
} }
...@@ -1980,12 +1987,12 @@ DecimalMod does modulus of two decimals. ...@@ -1980,12 +1987,12 @@ DecimalMod does modulus of two decimals.
thus, there's no requirement for M or N to be integers thus, there's no requirement for M or N to be integers
*/ */
func DecimalMod(from1, from2, to *BigDecimal) error { func DecimalMod(from1, from2, to *Decimal) error {
to.resultFrac = myMaxInt8(from1.resultFrac, from2.resultFrac) to.resultFrac = myMaxInt8(from1.resultFrac, from2.resultFrac)
return doDivMod(from1, from2, nil, to, 0) return doDivMod(from1, from2, nil, to, 0)
} }
func doDivMod(from1, from2, to, mod *BigDecimal, fracIncr int) error { func doDivMod(from1, from2, to, mod *Decimal, fracIncr int) error {
var ( var (
frac1 = digitsToWords(int(from1.digitsFrac)) * digitsPerWord frac1 = digitsToWords(int(from1.digitsFrac)) * digitsPerWord
prec1 = int(from1.digitsInt) + frac1 prec1 = int(from1.digitsInt) + frac1
...@@ -2246,34 +2253,34 @@ func DecimalPeak(b []byte) (int, error) { ...@@ -2246,34 +2253,34 @@ func DecimalPeak(b []byte) (int, error) {
return decimalBinSize(precision, frac) + 2, nil return decimalBinSize(precision, frac) + 2, nil
} }
// NewDecFromInt creates a BigDecimal from int. // NewDecFromInt creates a Decimal from int.
func NewDecFromInt(i int64) *BigDecimal { func NewDecFromInt(i int64) *Decimal {
return new(BigDecimal).FromInt(i) return new(Decimal).FromInt(i)
} }
// NewDecFromUint creates a BigDecimal from uint. // NewDecFromUint creates a Decimal from uint.
func NewDecFromUint(i uint64) *BigDecimal { func NewDecFromUint(i uint64) *Decimal {
return new(BigDecimal).FromUint(i) return new(Decimal).FromUint(i)
} }
// NewDecFromFloatForTest creates a BigDecimal from float, as it returns no error, it should only be used in test. // NewDecFromFloatForTest creates a Decimal from float, as it returns no error, it should only be used in test.
func NewDecFromFloatForTest(f float64) *BigDecimal { func NewDecFromFloatForTest(f float64) *Decimal {
dec := new(BigDecimal) dec := new(Decimal)
_ = dec.FromFloat64(f) _ = dec.FromFloat64(f)
//todo terror.Log(errors.Trace(err)) //todo terror.Log(errors.Trace(err))
return dec return dec
} }
// NewDecFromStringForTest creates a BigDecimal from string, as it returns no error, it should only be used in test. // NewDecFromStringForTest creates a Decimal from string, as it returns no error, it should only be used in test.
func NewDecFromStringForTest(s string) *BigDecimal { func NewDecFromStringForTest(s string) *Decimal {
dec := new(BigDecimal) dec := new(Decimal)
_ = dec.FromString([]byte(s)) _ = dec.FromString([]byte(s))
//todo terror.Log(errors.Trace(err)) //todo terror.Log(errors.Trace(err))
return dec return dec
} }
// NewMaxOrMinDec returns the max or min value decimal for given precision and fraction. // NewMaxOrMinDec returns the max or min value decimal for given precision and fraction.
func NewMaxOrMinDec(negative bool, prec, frac int) *BigDecimal { func NewMaxOrMinDec(negative bool, prec, frac int) *Decimal {
str := make([]byte, prec+2) str := make([]byte, prec+2)
for i := 0; i < len(str); i++ { for i := 0; i < len(str); i++ {
str[i] = '9' str[i] = '9'
...@@ -2284,7 +2291,7 @@ func NewMaxOrMinDec(negative bool, prec, frac int) *BigDecimal { ...@@ -2284,7 +2291,7 @@ func NewMaxOrMinDec(negative bool, prec, frac int) *BigDecimal {
str[0] = '+' str[0] = '+'
} }
str[1+prec-frac] = '.' str[1+prec-frac] = '.'
dec := new(BigDecimal) dec := new(Decimal)
_ = dec.FromString(str) _ = dec.FromString(str)
//todo terror.Log(errors.Trace(err)) //todo terror.Log(errors.Trace(err))
return dec return dec
......
...@@ -17,11 +17,11 @@ import "testing" ...@@ -17,11 +17,11 @@ import "testing"
func BenchmarkRound(b *testing.B) { func BenchmarkRound(b *testing.B) {
b.StopTimer() b.StopTimer()
var roundTo BigDecimal var roundTo Decimal
tests := []struct { tests := []struct {
input string input string
scale int scale int
inputDec BigDecimal inputDec Decimal
}{ }{
{input: "123456789.987654321", scale: 1}, {input: "123456789.987654321", scale: 1},
{input: "15.1", scale: 0}, {input: "15.1", scale: 0},
......
...@@ -50,7 +50,7 @@ func TestFromUint(t *testing.T) { ...@@ -50,7 +50,7 @@ func TestFromUint(t *testing.T) {
{18446744073709551615, "18446744073709551615"}, {18446744073709551615, "18446744073709551615"},
} }
for _, tt := range tests { for _, tt := range tests {
var dec BigDecimal var dec Decimal
dec.FromUint(tt.input) dec.FromUint(tt.input)
str := dec.ToString() str := dec.ToString()
assert.Equal(t, string(str), tt.output) assert.Equal(t, string(str), tt.output)
...@@ -73,7 +73,7 @@ func TestToInt(t *testing.T) { ...@@ -73,7 +73,7 @@ func TestToInt(t *testing.T) {
{"-9223372036854775809", -9223372036854775808, ErrOverflow}, {"-9223372036854775809", -9223372036854775808, ErrOverflow},
} }
for _, tt := range tests { for _, tt := range tests {
var dec BigDecimal var dec Decimal
dec.FromString([]byte(tt.input)) dec.FromString([]byte(tt.input))
result, ec := dec.ToInt() result, ec := dec.ToInt()
assert.Equal(t, ec, tt.err) assert.Equal(t, ec, tt.err)
...@@ -97,7 +97,7 @@ func TestToUint(t *testing.T) { ...@@ -97,7 +97,7 @@ func TestToUint(t *testing.T) {
{"9999999999999999999999999.000", 18446744073709551615, ErrOverflow}, {"9999999999999999999999999.000", 18446744073709551615, ErrOverflow},
} }
for _, tt := range tests { for _, tt := range tests {
var dec BigDecimal var dec Decimal
_ = dec.FromString([]byte(tt.input)) _ = dec.FromString([]byte(tt.input))
result, ec := dec.ToUint() result, ec := dec.ToUint()
assert.Equal(t, ec, tt.err) assert.Equal(t, ec, tt.err)
...@@ -135,7 +135,7 @@ func TestToFloat(t *testing.T) { ...@@ -135,7 +135,7 @@ func TestToFloat(t *testing.T) {
{"1234500009876.5", 1234500009876.5}, {"1234500009876.5", 1234500009876.5},
} }
for _, ca := range tests { for _, ca := range tests {
var dec BigDecimal var dec Decimal
_ = dec.FromString([]byte(ca.s)) _ = dec.FromString([]byte(ca.s))
f, _ := dec.ToFloat64() f, _ := dec.ToFloat64()
assert.Equal(t, f, ca.f) assert.Equal(t, f, ca.f)
...@@ -159,7 +159,7 @@ func TestToHashKey(t *testing.T) { ...@@ -159,7 +159,7 @@ func TestToHashKey(t *testing.T) {
for _, ca := range tests { for _, ca := range tests {
keys := make([]string, 0, len(ca.numbers)) keys := make([]string, 0, len(ca.numbers))
for _, num := range ca.numbers { for _, num := range ca.numbers {
var dec BigDecimal var dec Decimal
assert.Equal(t, dec.FromString([]byte(num)), nil) assert.Equal(t, dec.FromString([]byte(num)), nil)
key, err := dec.ToHashKey() key, err := dec.ToHashKey()
assert.Equal(t, err, nil) assert.Equal(t, err, nil)
...@@ -195,14 +195,14 @@ func TestToHashKey(t *testing.T) { ...@@ -195,14 +195,14 @@ func TestToHashKey(t *testing.T) {
for _, ca := range binTests { for _, ca := range binTests {
keys := make([]string, 0, len(ca.hashNumbers)+len(ca.binNumbers)) keys := make([]string, 0, len(ca.hashNumbers)+len(ca.binNumbers))
for _, num := range ca.hashNumbers { for _, num := range ca.hashNumbers {
var dec BigDecimal var dec Decimal
assert.Equal(t, dec.FromString([]byte(num)), nil) assert.Equal(t, dec.FromString([]byte(num)), nil)
key, err := dec.ToHashKey() key, err := dec.ToHashKey()
assert.Equal(t, err, nil) assert.Equal(t, err, nil)
keys = append(keys, string(key)) keys = append(keys, string(key))
} }
for _, num := range ca.binNumbers { for _, num := range ca.binNumbers {
var dec BigDecimal var dec Decimal
assert.Equal(t, dec.FromString([]byte(num)), nil) assert.Equal(t, dec.FromString([]byte(num)), nil)
prec, frac := dec.PrecisionAndFrac() // remove leading zeros but trailing zeros remain prec, frac := dec.PrecisionAndFrac() // remove leading zeros but trailing zeros remain
key, err := dec.ToBin(prec, frac) key, err := dec.ToBin(prec, frac)
...@@ -226,7 +226,7 @@ func TestRemoveTrailingZeros(t *testing.T) { ...@@ -226,7 +226,7 @@ func TestRemoveTrailingZeros(t *testing.T) {
"123987654321.123456789000", "000000000123", "123456789.987654321", "999.999000", "123987654321.123456789000", "000000000123", "123456789.987654321", "999.999000",
} }
for _, ca := range tests { for _, ca := range tests {
var dec BigDecimal var dec Decimal
assert.Equal(t, dec.FromString([]byte(ca)), nil) assert.Equal(t, dec.FromString([]byte(ca)), nil)
// calculate the number of digits after point but trailing zero // calculate the number of digits after point but trailing zero
...@@ -258,7 +258,7 @@ func TestShift(t *testing.T) { ...@@ -258,7 +258,7 @@ func TestShift(t *testing.T) {
} }
var dotest = func(t *testing.T, tests []tcase) { var dotest = func(t *testing.T, tests []tcase) {
for _, ca := range tests { for _, ca := range tests {
var dec BigDecimal var dec Decimal
err := dec.FromString([]byte(ca.input)) err := dec.FromString([]byte(ca.input))
//assert.Equal(t, err, IsNil) //assert.Equal(t, err, IsNil)
//origin := dec //origin := dec
...@@ -389,9 +389,9 @@ func TestRoundWithHalfEven(t *testing.T) { ...@@ -389,9 +389,9 @@ func TestRoundWithHalfEven(t *testing.T) {
} }
for _, ca := range tests { for _, ca := range tests {
var dec BigDecimal var dec Decimal
dec.FromString([]byte(ca.input)) dec.FromString([]byte(ca.input))
var rounded BigDecimal var rounded Decimal
err := dec.Round(&rounded, ca.scale, ModeHalfEven) err := dec.Round(&rounded, ca.scale, ModeHalfEven)
assert.Equal(t, err, ca.err) assert.Equal(t, err, ca.err)
result := rounded.ToString() result := rounded.ToString()
...@@ -423,9 +423,9 @@ func TestRoundWithTruncate(t *testing.T) { ...@@ -423,9 +423,9 @@ func TestRoundWithTruncate(t *testing.T) {
{"999999999", -9, "0", nil}, {"999999999", -9, "0", nil},
} }
for _, ca := range tests { for _, ca := range tests {
var dec BigDecimal var dec Decimal
dec.FromString([]byte(ca.input)) dec.FromString([]byte(ca.input))
var rounded BigDecimal var rounded Decimal
err := dec.Round(&rounded, ca.scale, ModeTruncate) err := dec.Round(&rounded, ca.scale, ModeTruncate)
assert.Equal(t, err, ca.err) assert.Equal(t, err, ca.err)
result := rounded.ToString() result := rounded.ToString()
...@@ -458,9 +458,9 @@ func TestRoundWithCeil(t *testing.T) { ...@@ -458,9 +458,9 @@ func TestRoundWithCeil(t *testing.T) {
{"999999999", -9, "1000000000", nil}, {"999999999", -9, "1000000000", nil},
} }
for _, ca := range tests { for _, ca := range tests {
var dec BigDecimal var dec Decimal
dec.FromString([]byte(ca.input)) dec.FromString([]byte(ca.input))
var rounded BigDecimal var rounded Decimal
err := dec.Round(&rounded, ca.scale, modeCeiling) err := dec.Round(&rounded, ca.scale, modeCeiling)
assert.Equal(t, err, ca.err) assert.Equal(t, err, ca.err)
result := rounded.ToString() result := rounded.ToString()
...@@ -485,7 +485,7 @@ func TestFromString(t *testing.T) { ...@@ -485,7 +485,7 @@ func TestFromString(t *testing.T) {
{"1e -1", "0.1", nil}, {"1e -1", "0.1", nil},
} }
for _, ca := range tests { for _, ca := range tests {
var dec BigDecimal var dec Decimal
err := dec.FromString([]byte(ca.input)) err := dec.FromString([]byte(ca.input))
if err != nil { if err != nil {
assert.Equal(t, err, ca.err) assert.Equal(t, err, ca.err)
...@@ -499,7 +499,7 @@ func TestFromString(t *testing.T) { ...@@ -499,7 +499,7 @@ func TestFromString(t *testing.T) {
{"123450.000098765", "123450", ErrTruncated}, {"123450.000098765", "123450", ErrTruncated},
} }
for _, ca := range tests { for _, ca := range tests {
var dec BigDecimal var dec Decimal
err := dec.FromString([]byte(ca.input)) err := dec.FromString([]byte(ca.input))
assert.Equal(t, err, ca.err) assert.Equal(t, err, ca.err)
result := string(dec.ToString()) result := string(dec.ToString())
...@@ -519,7 +519,7 @@ func TestToString(t *testing.T) { ...@@ -519,7 +519,7 @@ func TestToString(t *testing.T) {
{"00123.123", "123.123"}, {"00123.123", "123.123"},
} }
for _, ca := range tests { for _, ca := range tests {
var dec BigDecimal var dec Decimal
_ = dec.FromString([]byte(ca.input)) _ = dec.FromString([]byte(ca.input))
result := dec.ToString() result := dec.ToString()
assert.Equal(t, string(result), ca.output) assert.Equal(t, string(result), ca.output)
...@@ -552,18 +552,18 @@ func TestToBinFromBin(t *testing.T) { ...@@ -552,18 +552,18 @@ func TestToBinFromBin(t *testing.T) {
{"1000", 3, 0, "0", ErrOverflow}, {"1000", 3, 0, "0", ErrOverflow},
} }
for _, ca := range tests { for _, ca := range tests {
var dec BigDecimal var dec Decimal
err := dec.FromString([]byte(ca.input)) err := dec.FromString([]byte(ca.input))
assert.Equal(t, err, nil) assert.Equal(t, err, nil)
buf, err := dec.ToBin(ca.precision, ca.frac) buf, err := dec.ToBin(ca.precision, ca.frac)
assert.Equal(t, err, ca.err) assert.Equal(t, err, ca.err)
var dec2 BigDecimal var dec2 Decimal
_, err = dec2.FromBin(buf, ca.precision, ca.frac) _, err = dec2.FromBin(buf, ca.precision, ca.frac)
assert.Equal(t, err, nil) assert.Equal(t, err, nil)
str := dec2.ToString() str := dec2.ToString()
assert.Equal(t, string(str), ca.output) assert.Equal(t, string(str), ca.output)
} }
var dec BigDecimal var dec Decimal
dec.FromInt(1) dec.FromInt(1)
errTests := []struct { errTests := []struct {
prec int prec int
...@@ -600,7 +600,7 @@ func TestCompare(t *testing.T) { ...@@ -600,7 +600,7 @@ func TestCompare(t *testing.T) {
{"1.1", "1.2", -1}, {"1.1", "1.2", -1},
} }
for _, tt := range tests { for _, tt := range tests {
var a, b BigDecimal var a, b Decimal
_ = a.FromString([]byte(tt.a)) _ = a.FromString([]byte(tt.a))
_ = b.FromString([]byte(tt.b)) _ = b.FromString([]byte(tt.b))
assert.Equal(t, a.Compare(&b), tt.cmp) assert.Equal(t, a.Compare(&b), tt.cmp)
...@@ -631,7 +631,7 @@ func TestMaxDecimal(t *testing.T) { ...@@ -631,7 +631,7 @@ func TestMaxDecimal(t *testing.T) {
{40, 20, "99999999999999999999.99999999999999999999"}, {40, 20, "99999999999999999999.99999999999999999999"},
} }
for _, tt := range tests { for _, tt := range tests {
var dec BigDecimal var dec Decimal
maxDecimal(tt.prec, tt.frac, &dec) maxDecimal(tt.prec, tt.frac, &dec)
str := dec.ToString() str := dec.ToString()
assert.Equal(t, string(str), tt.result) assert.Equal(t, string(str), tt.result)
...@@ -684,7 +684,7 @@ func TestAdd(t *testing.T) { ...@@ -684,7 +684,7 @@ func TestAdd(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
a := NewDecFromStringForTest(tt.a) a := NewDecFromStringForTest(tt.a)
b := NewDecFromStringForTest(tt.b) b := NewDecFromStringForTest(tt.b)
var sum BigDecimal var sum Decimal
err := DecimalAdd(a, b, &sum) err := DecimalAdd(a, b, &sum)
assert.Equal(t, err, tt.err) assert.Equal(t, err, tt.err)
result := sum.ToString() result := sum.ToString()
...@@ -716,7 +716,7 @@ func TestSub(t *testing.T) { ...@@ -716,7 +716,7 @@ func TestSub(t *testing.T) {
{"12345", "-123.45", "12468.45", nil}, {"12345", "-123.45", "12468.45", nil},
} }
for _, tt := range tests { for _, tt := range tests {
var a, b, sum BigDecimal var a, b, sum Decimal
a.FromString([]byte(tt.a)) a.FromString([]byte(tt.a))
b.FromString([]byte(tt.b)) b.FromString([]byte(tt.b))
err := DecimalSub(&a, &b, &sum) err := DecimalSub(&a, &b, &sum)
...@@ -747,7 +747,7 @@ func TestMul(t *testing.T) { ...@@ -747,7 +747,7 @@ func TestMul(t *testing.T) {
{"0.5999991229317", "0.918755041726042", "0.5512522192247026369112773314", nil}, {"0.5999991229317", "0.918755041726042", "0.5512522192247026369112773314", nil},
} }
for _, tt := range tests { for _, tt := range tests {
var a, b, product BigDecimal var a, b, product Decimal
a.FromString([]byte(tt.a)) a.FromString([]byte(tt.a))
b.FromString([]byte(tt.b)) b.FromString([]byte(tt.b))
err := DecimalMul(&a, &b, &product) err := DecimalMul(&a, &b, &product)
...@@ -782,7 +782,7 @@ func TestDivMod(t *testing.T) { ...@@ -782,7 +782,7 @@ func TestDivMod(t *testing.T) {
{"51", "0.003430", "14868.804664723032069970", nil}, {"51", "0.003430", "14868.804664723032069970", nil},
} }
for _, tt := range tests { for _, tt := range tests {
var a, b, to BigDecimal var a, b, to Decimal
a.FromString([]byte(tt.a)) a.FromString([]byte(tt.a))
b.FromString([]byte(tt.b)) b.FromString([]byte(tt.b))
err := doDivMod(&a, &b, &to, nil, 5) err := doDivMod(&a, &b, &to, nil, 5)
...@@ -804,7 +804,7 @@ func TestDivMod(t *testing.T) { ...@@ -804,7 +804,7 @@ func TestDivMod(t *testing.T) {
{"0.0000000001", "1.0", "0.0000000001", nil}, {"0.0000000001", "1.0", "0.0000000001", nil},
} }
for _, tt := range tests { for _, tt := range tests {
var a, b, to BigDecimal var a, b, to Decimal
a.FromString([]byte(tt.a)) a.FromString([]byte(tt.a))
b.FromString([]byte(tt.b)) b.FromString([]byte(tt.b))
ec := doDivMod(&a, &b, nil, &to, 0) ec := doDivMod(&a, &b, nil, &to, 0)
...@@ -824,7 +824,7 @@ func TestDivMod(t *testing.T) { ...@@ -824,7 +824,7 @@ func TestDivMod(t *testing.T) {
{"51", "0.003430", "14868.8047", nil}, {"51", "0.003430", "14868.8047", nil},
} }
for _, tt := range tests { for _, tt := range tests {
var a, b, to BigDecimal var a, b, to Decimal
a.FromString([]byte(tt.a)) a.FromString([]byte(tt.a))
b.FromString([]byte(tt.b)) b.FromString([]byte(tt.b))
ec := DecimalDiv(&a, &b, &to, DivFracIncr) ec := DecimalDiv(&a, &b, &to, DivFracIncr)
...@@ -842,10 +842,10 @@ func TestDivMod(t *testing.T) { ...@@ -842,10 +842,10 @@ func TestDivMod(t *testing.T) {
{"51", "0.003430", "0.002760", nil}, {"51", "0.003430", "0.002760", nil},
} }
for _, tt := range tests { for _, tt := range tests {
var a, b, to BigDecimal var a, b, to Decimal
a.FromString([]byte(tt.a))
b.FromString([]byte(tt.b))
ec := DecimalMod(&a, &b, &to) ec := DecimalMod(&a, &b, &to)
_ = a.FromString([]byte(tt.a))
_ = b.FromString([]byte(tt.b))
assert.Equal(t, ec, tt.err) assert.Equal(t, ec, tt.err)
if tt.err == ErrDivByZero { if tt.err == ErrDivByZero {
continue continue
...@@ -885,9 +885,9 @@ func benchmarkBigDecimalToBinOrHashCases() []string { ...@@ -885,9 +885,9 @@ func benchmarkBigDecimalToBinOrHashCases() []string {
func BenchmarkBigDecimalToBin(b *testing.B) { func BenchmarkBigDecimalToBin(b *testing.B) {
cases := benchmarkBigDecimalToBinOrHashCases() cases := benchmarkBigDecimalToBinOrHashCases()
decs := make([]*BigDecimal, 0, len(cases)) decs := make([]*Decimal, 0, len(cases))
for _, ca := range cases { for _, ca := range cases {
var dec BigDecimal var dec Decimal
if err := dec.FromString([]byte(ca)); err != nil { if err := dec.FromString([]byte(ca)); err != nil {
b.Fatal(err) b.Fatal(err)
} }
...@@ -908,9 +908,9 @@ func BenchmarkBigDecimalToBin(b *testing.B) { ...@@ -908,9 +908,9 @@ func BenchmarkBigDecimalToBin(b *testing.B) {
func BenchmarkBigDecimalToHashKey(b *testing.B) { func BenchmarkBigDecimalToHashKey(b *testing.B) {
cases := benchmarkBigDecimalToBinOrHashCases() cases := benchmarkBigDecimalToBinOrHashCases()
decs := make([]*BigDecimal, 0, len(cases)) decs := make([]*Decimal, 0, len(cases))
for _, ca := range cases { for _, ca := range cases {
var dec BigDecimal var dec Decimal
if err := dec.FromString([]byte(ca)); err != nil { if err := dec.FromString([]byte(ca)); err != nil {
b.Fatal(err) b.Fatal(err)
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment