Documentation
¶
Overview ¶
Package decimal implements an arbitrary precision fixed-point decimal.
The zero-value of a Decimal is 0, as you would expect.
The best way to create a new Decimal is to use decimal.NewFromString, ex:
n, err := decimal.NewFromString("-123.4567")
n.String() // output: "-123.4567"
To use Decimal as part of a struct:
type StructName struct {
Number Decimal
}
Note: This can "only" represent numbers with a maximum of 2^31 digits after the decimal point.
Index ¶
- Variables
- func RescalePair(d1 Decimal, d2 Decimal) (Decimal, Decimal)
- type Decimal
- func Avg(first Decimal, rest ...Decimal) Decimal
- func Max(first Decimal, rest ...Decimal) Decimal
- func Min(first Decimal, rest ...Decimal) Decimal
- func New(value int64, exp int32) Decimal
- func NewFromBigInt(value *big.Int, exp int32) Decimal
- func NewFromBigRat(value *big.Rat, precision int32) Decimal
- func NewFromFloat(value float64) Decimal
- func NewFromFloat32(value float32) Decimal
- func NewFromFloatWithExponent(value float64, exp int32) Decimal
- func NewFromFormattedString(value string, replRegexp *regexp.Regexp) (Decimal, error)
- func NewFromInt(value int64) Decimal
- func NewFromInt32(value int32) Decimal
- func NewFromString(value string) (Decimal, error)
- func NewFromUint64(value uint64) Decimal
- func RequireFromString(value string) Decimal
- func Sum(first Decimal, rest ...Decimal) Decimal
- func (d Decimal) Abs() Decimal
- func (d Decimal) Add(d2 Decimal) Decimal
- func (d Decimal) Atan() Decimal
- func (d Decimal) BigFloat() *big.Float
- func (d Decimal) BigInt() *big.Int
- func (d Decimal) Ceil() Decimal
- func (d Decimal) Cmp(d2 Decimal) int
- func (d Decimal) Coefficient() *big.Int
- func (d Decimal) CoefficientInt64() int64
- func (d Decimal) Compare(d2 Decimal) int
- func (d Decimal) Copy() Decimal
- func (d Decimal) Cos() Decimal
- func (d *Decimal) DecodeSpanner(val interface{}) error
- func (d Decimal) Div(d2 Decimal) Decimal
- func (d Decimal) DivRound(d2 Decimal, precision int32) Decimal
- func (d Decimal) EncodeSpanner() (interface{}, error)
- func (d Decimal) Equal(d2 Decimal) bool
- func (d Decimal) Equals(d2 Decimal) booldeprecated
- func (d Decimal) ExpHullAbrham(overallPrecision uint32) (Decimal, error)
- func (d Decimal) ExpTaylor(precision int32) (Decimal, error)
- func (d Decimal) Exponent() int32
- func (d Decimal) Float64() (f float64, exact bool)
- func (d Decimal) Floor() Decimal
- func (d *Decimal) GobDecode(data []byte) error
- func (d Decimal) GobEncode() ([]byte, error)
- func (d Decimal) GreaterThan(d2 Decimal) bool
- func (d Decimal) GreaterThanOrEqual(d2 Decimal) bool
- func (d Decimal) InexactFloat64() float64
- func (d Decimal) IntPart() int64
- func (d Decimal) IsInteger() bool
- func (d Decimal) IsNegative() bool
- func (d Decimal) IsPositive() bool
- func (d Decimal) IsZero() bool
- func (d Decimal) LessThan(d2 Decimal) bool
- func (d Decimal) LessThanOrEqual(d2 Decimal) bool
- func (d Decimal) Ln(precision int32) (Decimal, error)
- func (d Decimal) MarshalBinary() (data []byte, err error)
- func (d Decimal) MarshalJSON() ([]byte, error)
- func (d Decimal) MarshalText() (text []byte, err error)
- func (d Decimal) Mod(d2 Decimal) Decimal
- func (d Decimal) Mul(d2 Decimal) Decimal
- func (d Decimal) Neg() Decimal
- func (d Decimal) NumDigits() int
- func (d Decimal) Pow(d2 Decimal) Decimal
- func (d Decimal) PowBigInt(exp *big.Int) (Decimal, error)
- func (d Decimal) PowInt32(exp int32) (Decimal, error)
- func (d Decimal) PowWithPrecision(d2 Decimal, precision int32) (Decimal, error)
- func (d Decimal) QuoRem(d2 Decimal, precision int32) (Decimal, Decimal)
- func (d Decimal) Rat() *big.Rat
- func (d Decimal) Round(places int32) Decimal
- func (d Decimal) RoundBank(places int32) Decimal
- func (d Decimal) RoundCash(interval uint8) Decimal
- func (d Decimal) RoundCeil(places int32) Decimal
- func (d Decimal) RoundDown(places int32) Decimal
- func (d Decimal) RoundFloor(places int32) Decimal
- func (d Decimal) RoundUp(places int32) Decimal
- func (d *Decimal) Scan(value interface{}) error
- func (d Decimal) ScientificNotationString() string
- func (d Decimal) Shift(shift int32) Decimal
- func (d Decimal) Sign() int
- func (d Decimal) Sin() Decimal
- func (d Decimal) String() string
- func (d Decimal) StringFixed(places int32) string
- func (d Decimal) StringFixedBank(places int32) string
- func (d Decimal) StringFixedCash(interval uint8) string
- func (d Decimal) StringScaled(exp int32) stringdeprecated
- func (d Decimal) Sub(d2 Decimal) Decimal
- func (d Decimal) Tan() Decimal
- func (d Decimal) Truncate(precision int32) Decimal
- func (d *Decimal) UnmarshalBinary(data []byte) error
- func (d *Decimal) UnmarshalJSON(decimalBytes []byte) error
- func (d *Decimal) UnmarshalText(text []byte) error
- func (d Decimal) Value() (driver.Value, error)
- type NullDecimal
- func (d *NullDecimal) DecodeSpanner(value interface{}) error
- func (d NullDecimal) EncodeSpanner() (interface{}, error)
- func (d NullDecimal) MarshalJSON() ([]byte, error)
- func (d NullDecimal) MarshalText() (text []byte, err error)
- func (d *NullDecimal) Scan(value interface{}) error
- func (d *NullDecimal) UnmarshalJSON(decimalBytes []byte) error
- func (d *NullDecimal) UnmarshalText(text []byte) error
- func (d NullDecimal) Value() (driver.Value, error)
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var DivisionPrecision = 16
DivisionPrecision is the number of decimal places in the result when it doesn't divide exactly.
Example:
d1 := decimal.NewFromFloat(2).Div(decimal.NewFromFloat(3)) d1.String() // output: "0.6666666666666667" d2 := decimal.NewFromFloat(2).Div(decimal.NewFromFloat(30000)) d2.String() // output: "0.0000666666666667" d3 := decimal.NewFromFloat(20000).Div(decimal.NewFromFloat(3)) d3.String() // output: "6666.6666666666666667" decimal.DivisionPrecision = 3 d4 := decimal.NewFromFloat(2).Div(decimal.NewFromFloat(3)) d4.String() // output: "0.667"
var ExpMaxIterations = 1000
ExpMaxIterations specifies the maximum number of iterations needed to calculate precise natural exponent value using ExpHullAbrham method.
var MarshalJSONWithoutQuotes = false
MarshalJSONWithoutQuotes should be set to true if you want the decimal to be JSON marshaled as a number, instead of as a string. WARNING: this is dangerous for decimals with many digits, since many JSON unmarshallers (ex: Javascript's) will unmarshal JSON numbers to IEEE 754 double-precision floating point numbers, which means you can potentially silently lose precision.
var MaxDecodeExponent = 10000
MaxDecodeExponent is the largest exponent magnitude that NewFromString and UnmarshalBinary accept, and so UnmarshalJSON, UnmarshalText, Scan, GobDecode, DecodeSpanner and their NullDecimal variants too. Operations like String, Add and Float64 take time and memory that grow with the exponent, so without this limit a short input like "1e-2000000000" can stall the process or exhaust its memory. The default covers the float64 and IEEE 754 decimal128 exponent ranges.
Values created with New, NewFromBigInt or arithmetic are not checked, so they may not decode back from their own String or MarshalBinary output. The limit does not bound the cost of Pow or ExpTaylor arguments or of very long inputs; validate those separately.
Set it once at program start, before any decoding. Raise it only for trusted input.
var PowPrecisionNegativeExponent = 16
PowPrecisionNegativeExponent specifies the number of digits after the decimal point in the results of Pow, PowInt32 and PowBigInt for negative or non-integer exponents. A result that would round to 0 keeps PowPrecisionNegativeExponent significant digits instead (at least one). PowWithPrecision is not affected, it takes the precision as an argument.
Example:
d1, err := decimal.NewFromFloat(15.2).PowInt32(-2) d1.String() // output: "0.0043282548476454" decimal.PowPrecisionNegativeExponent = 24 d2, err := decimal.NewFromFloat(15.2).PowInt32(-2) d2.String() // output: "0.004328254847645429362881"
var TrimTrailingZeros = true
TrimTrailingZeros specifies whether trailing zeroes should be trimmed from a string representation of decimal. If set to true, trailing zeroes will be truncated (2.00 -> 2, 3.11 -> 3.11, 13.000 -> 13), otherwise trailing zeroes will be preserved (2.00 -> 2.00, 3.11 -> 3.11, 13.000 -> 13.000). Setting this value to false can be useful for APIs where exact decimal string representation matters.
var UseScientificNotation = false
UseScientificNotation specifies whether scientific notation should be used when a decimal is turned into a string that has a "negative" precision.
For example, 1200 rounded to the nearest 100 cannot accurately be shown as "1200" because the last two digits are unknown. With this set to true, that number would be expressed as "1.2E3" instead.
var Zero = Decimal{}
Zero constant, to make computations faster. Zero should never be compared with == or != directly, please use decimal.Equal or decimal.Cmp instead.
Functions ¶
Types ¶
type Decimal ¶
type Decimal struct {
// contains filtered or unexported fields
}
Decimal represents a fixed-point decimal. It is immutable. number = value * 10 ^ exp
func Max ¶
Max returns the largest Decimal that was passed in the arguments.
To call this function with an array, you must do:
Max(arr[0], arr[1:]...)
This makes it harder to accidentally call Max with 0 arguments.
func Min ¶
Min returns the smallest Decimal that was passed in the arguments.
To call this function with an array, you must do:
Min(arr[0], arr[1:]...)
This makes it harder to accidentally call Min with 0 arguments.
func NewFromBigInt ¶
NewFromBigInt returns a new Decimal from a big.Int, value * 10 ^ exp
func NewFromBigRat ¶ added in v1.4.0
NewFromBigRat returns a new Decimal from a big.Rat. The numerator and denominator are divided and rounded to the given precision.
Example:
d1 := NewFromBigRat(big.NewRat(0, 1), 0) // output: "0" d2 := NewFromBigRat(big.NewRat(4, 5), 1) // output: "0.8" d3 := NewFromBigRat(big.NewRat(1000, 3), 3) // output: "333.333" d4 := NewFromBigRat(big.NewRat(2, 7), 4) // output: "0.2857"
func NewFromFloat ¶
NewFromFloat converts a float64 to Decimal.
The result is the shortest decimal that converts back to the same float64, the same number that strconv.FormatFloat(value, 'f', -1, 64) prints. This is typically 15 digits, but may be more in some cases. See https://www.exploringbinary.com/decimal-precision-of-binary-floating-point-numbers/ for more information.
This is not always the exact value stored in the float. Whole numbers larger than 2^53 can change: float64(1<<62) is exactly 4611686018427387904, but NewFromFloat returns 4611686018427388000. To convert whole numbers exactly, use NewFromFloatWithExponent(value, 0).
For slightly faster conversion, use NewFromFloatWithExponent where you can specify the precision in absolute terms.
NOTE: this will panic on NaN, +/-inf
Example ¶
fmt.Println(NewFromFloat(123.123123123123).String()) fmt.Println(NewFromFloat(.123123123123123).String()) fmt.Println(NewFromFloat(-1e13).String()) fmt.Println(NewFromFloat(1 << 62).String()) fmt.Println(NewFromFloatWithExponent(1<<62, 0).String())
Output: 123.123123123123 0.123123123123123 -10000000000000 4611686018427388000 4611686018427387904
func NewFromFloat32 ¶ added in v1.1.0
NewFromFloat32 converts a float32 to Decimal.
The result is the shortest decimal that converts back to the same float32. This is typically 6-8 digits depending on the input. See https://www.exploringbinary.com/decimal-precision-of-binary-floating-point-numbers/ for more information.
As with NewFromFloat, whole numbers larger than 2^24 can change. To convert them exactly, use NewFromFloatWithExponent(float64(value), 0).
For slightly faster conversion, use NewFromFloatWithExponent where you can specify the precision in absolute terms.
NOTE: this will panic on NaN, +/-inf
Example ¶
fmt.Println(NewFromFloat32(123.123123123123).String()) fmt.Println(NewFromFloat32(.123123123123123).String()) fmt.Println(NewFromFloat32(-1e13).String())
Output: 123.12312 0.123123124 -10000000000000
func NewFromFloatWithExponent ¶
NewFromFloatWithExponent converts a float64 to Decimal, with an arbitrary number of fractional digits.
Example:
NewFromFloatWithExponent(123.456, -2).String() // output: "123.46"
func NewFromFormattedString ¶ added in v1.3.0
NewFromFormattedString returns a new Decimal from a formatted string representation. The second argument - replRegexp, is a regular expression that is used to find characters that should be removed from given decimal string representation. All matched characters will be replaced with an empty string.
Example:
r := regexp.MustCompile("[$,]")
d1, err := NewFromFormattedString("$5,125.99", r)
r2 := regexp.MustCompile("[_]")
d2, err := NewFromFormattedString("1_000_000", r2)
r3 := regexp.MustCompile("[USD\\s]")
d3, err := NewFromFormattedString("5000 USD", r3)
func NewFromInt ¶ added in v1.2.0
NewFromInt converts an int64 to Decimal.
Example:
NewFromInt(123).String() // output: "123" NewFromInt(-10).String() // output: "-10"
func NewFromInt32 ¶ added in v1.2.0
NewFromInt32 converts an int32 to Decimal.
Example:
NewFromInt(123).String() // output: "123" NewFromInt(-10).String() // output: "-10"
func NewFromString ¶
NewFromString returns a new Decimal from a string representation. Trailing zeroes are not trimmed.
Example:
d, err := NewFromString("-123.45")
d2, err := NewFromString(".0001")
d3, err := NewFromString("1.47000")
func NewFromUint64 ¶ added in v1.4.0
NewFromUint64 converts an uint64 to Decimal.
Example:
NewFromUint64(123).String() // output: "123"
func RequireFromString ¶ added in v1.0.1
RequireFromString returns a new Decimal from a string representation or panics if NewFromString had returned an error.
Example:
d := RequireFromString("-123.45")
d2 := RequireFromString(".0001")
func (Decimal) BigFloat ¶ added in v1.2.0
BigFloat returns decimal as BigFloat. Be aware that casting decimal to BigFloat might cause a loss of precision.
func (Decimal) BigInt ¶ added in v1.2.0
BigInt returns integer component of the decimal as a BigInt.
func (Decimal) Cmp ¶
Cmp compares the numbers represented by d and d2 and returns:
-1 if d < d2 0 if d == d2 +1 if d > d2
func (Decimal) Coefficient ¶
Coefficient returns the coefficient of the decimal. It is scaled by 10^Exponent()
func (Decimal) CoefficientInt64 ¶ added in v1.3.0
CoefficientInt64 returns the coefficient of the decimal as int64. It is scaled by 10^Exponent() If coefficient cannot be represented in an int64, the result will be undefined.
func (Decimal) Compare ¶ added in v1.4.0
Compare compares the numbers represented by d and d2 and returns:
-1 if d < d2 0 if d == d2 +1 if d > d2
func (Decimal) Copy ¶ added in v1.3.0
Copy returns a copy of decimal with the same value and exponent, but a different pointer to value.
func (*Decimal) DecodeSpanner ¶ added in v1.5.0
DecodeSpanner decodes a Spanner value into a Decimal
func (Decimal) Div ¶
Div returns d / d2. If it doesn't divide exactly, the result will have DivisionPrecision digits after the decimal point.
func (Decimal) DivRound ¶
DivRound divides and rounds to a given precision i.e. to an integer multiple of 10^(-precision)
for a positive quotient digit 5 is rounded up, away from 0 if the quotient is negative then digit 5 is rounded down, away from 0
Note that precision<0 is allowed as input.
func (Decimal) EncodeSpanner ¶ added in v1.5.0
EncodeSpanner encodes a Decimal into a Spanner value
func (Decimal) ExpHullAbrham ¶ added in v1.3.0
ExpHullAbrham calculates the natural exponent of decimal (e to the power of d) using Hull-Abraham algorithm. OverallPrecision argument specifies the overall precision of the result (integer part + decimal part).
ExpHullAbrham is faster than ExpTaylor for small precision values, but it is much slower for large precision values.
Example:
NewFromFloat(26.1).ExpHullAbrham(2).String() // output: "220000000000" NewFromFloat(26.1).ExpHullAbrham(20).String() // output: "216314672147.05767284"
func (Decimal) ExpTaylor ¶ added in v1.3.0
ExpTaylor calculates the natural exponent of decimal (e to the power of d) using Taylor series expansion. Precision argument specifies how precise the result must be (number of digits after decimal point). Negative precision is allowed.
ExpTaylor is much faster for large precision values than ExpHullAbrham.
Example:
d, err := NewFromFloat(26.1).ExpTaylor(2).String() d.String() // output: "216314672147.06" NewFromFloat(26.1).ExpTaylor(20).String() d.String() // output: "216314672147.05767284062928674083" NewFromFloat(26.1).ExpTaylor(-10).String() d.String() // output: "220000000000"
func (Decimal) Float64 ¶
Float64 returns the nearest float64 value for d and a bool indicating whether f represents d exactly. For more details, see the documentation for big.Rat.Float64
func (*Decimal) GobDecode ¶
GobDecode implements the gob.GobDecoder interface for gob serialization.
func (Decimal) GreaterThan ¶
GreaterThan (GT) returns true when d is greater than d2.
func (Decimal) GreaterThanOrEqual ¶
GreaterThanOrEqual (GTE) returns true when d is greater than or equal to d2.
func (Decimal) InexactFloat64 ¶ added in v1.3.0
InexactFloat64 returns the nearest float64 value for d. It doesn't indicate if the returned value represents d exactly.
func (Decimal) IsInteger ¶ added in v1.3.0
IsInteger returns true when decimal can be represented as an integer value, otherwise, it returns false.
func (Decimal) IsNegative ¶ added in v1.1.0
IsNegative return
true if d < 0 false if d == 0 false if d > 0
func (Decimal) IsPositive ¶ added in v1.1.0
IsPositive return
true if d > 0 false if d == 0 false if d < 0
func (Decimal) LessThanOrEqual ¶
LessThanOrEqual (LTE) returns true when d is less than or equal to d2.
func (Decimal) Ln ¶ added in v1.4.0
Ln calculates natural logarithm of d. Precision argument specifies how precise the result must be (number of digits after decimal point). Negative precision is allowed.
Example:
d1, err := NewFromFloat(13.3).Ln(2) d1.String() // output: "2.59" d2, err := NewFromFloat(579.161).Ln(10) d2.String() // output: "6.3615805046"
func (Decimal) MarshalBinary ¶
MarshalBinary implements the encoding.BinaryMarshaler interface.
func (Decimal) MarshalJSON ¶
MarshalJSON implements the json.Marshaler interface.
func (Decimal) MarshalText ¶
MarshalText implements the encoding.TextMarshaler interface for XML serialization.
func (Decimal) NumDigits ¶ added in v1.3.0
NumDigits returns the number of digits of the decimal coefficient (d.Value)
func (Decimal) Pow ¶
Pow returns d to the power of d2. The result is exact for non-negative integer exponents. For negative or non-integer exponents it is rounded half away from zero to PowPrecisionNegativeExponent places after the decimal point. A result that would round to 0 keeps PowPrecisionNegativeExponent significant digits instead (at least one).
Pow returns 0 (zero-value of Decimal) instead of error for power operation edge cases, to handle those edge cases use PowWithPrecision. Edge cases not handled by Pow:
- 0 ** 0 => undefined value
- 0 ** y, where y < 0 => infinity
- x ** y, where x < 0 and y is non-integer decimal => imaginary value
- x ** y, where the magnitude of the result or the precision is too large to represent
Example:
d1 := decimal.NewFromFloat(4.0) d2 := decimal.NewFromFloat(4.0) res1 := d1.Pow(d2) res1.String() // output: "256" d3 := decimal.NewFromFloat(5.0) d4 := decimal.NewFromFloat(5.73) res2 := d3.Pow(d4) res2.String() // output: "10118.0803715950193171" d5 := decimal.NewFromInt(10) d6 := decimal.NewFromInt(-18) res3 := d5.Pow(d6) res3.String() // output: "0.000000000000000001"
func (Decimal) PowBigInt ¶ added in v1.4.0
PowBigInt returns d to the power of exp, where exp is big.Int. Returns error for 0 ** 0, 0 ** exp where exp < 0, and results whose magnitude is too large to represent.
For negative exponents the result is rounded half away from zero to PowPrecisionNegativeExponent places after the decimal point. A result that would round to 0 keeps PowPrecisionNegativeExponent significant digits instead (at least one).
Example:
d1, err := decimal.NewFromFloat(3.0).PowBigInt(big.NewInt(3)) d1.String() // output: "27" d2, err := decimal.NewFromFloat(629.25).PowBigInt(big.NewInt(5)) d2.String() // output: "98654323103449.5673828125"
func (Decimal) PowInt32 ¶ added in v1.4.0
PowInt32 returns d to the power of exp, where exp is int32. Returns error for 0 ** 0, 0 ** exp where exp < 0, and results whose magnitude is too large to represent.
For negative exponents the result is rounded half away from zero to PowPrecisionNegativeExponent places after the decimal point. A result that would round to 0 keeps PowPrecisionNegativeExponent significant digits instead (at least one).
Example:
d1, err := decimal.NewFromFloat(4.0).PowInt32(4) d1.String() // output: "256" d2, err := decimal.NewFromFloat(3.13).PowInt32(5) d2.String() // output: "300.4150512793"
func (Decimal) PowWithPrecision ¶ added in v1.4.0
PowWithPrecision returns d to the power of d2. The result is exact for non-negative integer exponents. For negative or non-integer exponents it is rounded half away from zero to precision places after the decimal point. A result that would round to 0 keeps precision significant digits instead (at least one).
PowWithPrecision returns error when:
- 0 ** 0 => undefined value
- 0 ** y, where y < 0 => infinity
- x ** y, where x < 0 and y is non-integer decimal => imaginary value
- x ** y, where the magnitude of the result or the precision is too large to represent
Example:
d1 := decimal.NewFromFloat(4.0) d2 := decimal.NewFromFloat(4.0) res1, err := d1.PowWithPrecision(d2, 2) res1.String() // output: "256" d3 := decimal.NewFromFloat(5.0) d4 := decimal.NewFromFloat(5.73) res2, err := d3.PowWithPrecision(d4, 5) res2.String() // output: "10118.08037" d5 := decimal.NewFromFloat(-3.0) d6 := decimal.NewFromFloat(-6.0) res3, err := d5.PowWithPrecision(d6, 10) res3.String() // output: "0.0013717421"
func (Decimal) QuoRem ¶
QuoRem does division with remainder d.QuoRem(d2,precision) returns quotient q and remainder r such that
d = d2 * q + r, q an integer multiple of 10^(-precision) 0 <= r < abs(d2) * 10 ^(-precision) if d>=0 0 >= r > -abs(d2) * 10 ^(-precision) if d<0
Note that precision<0 is allowed as input.
func (Decimal) Round ¶
Round rounds the decimal to places decimal places. If places < 0, it will round the integer part to the nearest 10^(-places).
Example:
NewFromFloat(5.45).Round(1).String() // output: "5.5" NewFromFloat(545).Round(-1).String() // output: "550" (with UseScientificNotation false, "5.5E2" if true)
func (Decimal) RoundBank ¶
RoundBank rounds the decimal to places decimal places. If the final digit to round is equidistant from the nearest two integers the rounded value is taken as the even number
If places < 0, it will round the integer part to the nearest 10^(-places).
Examples:
NewFromFloat(5.45).RoundBank(1).String() // output: "5.4" NewFromFloat(545).RoundBank(-1).String() // output: "540" NewFromFloat(5.46).RoundBank(1).String() // output: "5.5" NewFromFloat(546).RoundBank(-1).String() // output: "550" NewFromFloat(5.55).RoundBank(1).String() // output: "5.6" NewFromFloat(555).RoundBank(-1).String() // output: "560"
func (Decimal) RoundCash ¶
RoundCash aka Cash/Penny/öre rounding rounds decimal to a specific interval. The amount payable for a cash transaction is rounded to the nearest multiple of the minimum currency unit available. The following intervals are available: 5, 10, 25, 50 and 100; any other number throws a panic.
5: 5 cent rounding 3.43 => 3.45 10: 10 cent rounding 3.45 => 3.50 (5 gets rounded up) 25: 25 cent rounding 3.41 => 3.50 50: 50 cent rounding 3.75 => 4.00 100: 100 cent rounding 3.50 => 4.00
For more details: https://en.wikipedia.org/wiki/Cash_rounding
func (Decimal) RoundCeil ¶ added in v1.3.0
RoundCeil rounds the decimal towards +infinity.
Example:
NewFromFloat(545).RoundCeil(-2).String() // output: "600" NewFromFloat(500).RoundCeil(-2).String() // output: "500" NewFromFloat(1.1001).RoundCeil(2).String() // output: "1.11" NewFromFloat(-1.454).RoundCeil(1).String() // output: "-1.4"
func (Decimal) RoundDown ¶ added in v1.3.0
RoundDown rounds the decimal towards zero.
Example:
NewFromFloat(545).RoundDown(-2).String() // output: "500" NewFromFloat(-500).RoundDown(-2).String() // output: "-500" NewFromFloat(1.1001).RoundDown(2).String() // output: "1.1" NewFromFloat(-1.454).RoundDown(1).String() // output: "-1.4"
func (Decimal) RoundFloor ¶ added in v1.3.0
RoundFloor rounds the decimal towards -infinity.
Example:
NewFromFloat(545).RoundFloor(-2).String() // output: "500" NewFromFloat(-500).RoundFloor(-2).String() // output: "-500" NewFromFloat(1.1001).RoundFloor(2).String() // output: "1.1" NewFromFloat(-1.454).RoundFloor(1).String() // output: "-1.5"
func (Decimal) RoundUp ¶ added in v1.3.0
RoundUp rounds the decimal away from zero.
Example:
NewFromFloat(545).RoundUp(-2).String() // output: "600" NewFromFloat(500).RoundUp(-2).String() // output: "500" NewFromFloat(1.1001).RoundUp(2).String() // output: "1.11" NewFromFloat(-1.454).RoundUp(1).String() // output: "-1.5"
func (Decimal) ScientificNotationString ¶ added in v1.5.0
ScientificNotationString serializes the decimal into standard scientific notation.
The notation is normalized to have one non-zero digit followed by a decimal point and the remaining significant digits followed by "E" and the base-10 exponent.
A zero, which has no significant digits, is simply serialized to "0".
func (Decimal) Shift ¶ added in v1.1.0
Shift shifts the decimal in base 10. It shifts left when shift is positive and right if shift is negative. In simpler terms, the given value for shift is added to the exponent of the decimal. Shift panics if the resulting exponent does not fit in an int32.
func (Decimal) String ¶
String returns the string representation of the decimal with the fixed point.
Example:
d := New(-12345, -3) println(d.String())
Output:
-12.345
func (Decimal) StringFixed ¶
StringFixed returns a rounded fixed-point string with places digits after the decimal point.
Example:
NewFromFloat(0).StringFixed(2) // output: "0.00" NewFromFloat(0).StringFixed(0) // output: "0" NewFromFloat(5.45).StringFixed(0) // output: "5" NewFromFloat(5.45).StringFixed(1) // output: "5.5" NewFromFloat(5.45).StringFixed(2) // output: "5.45" NewFromFloat(5.45).StringFixed(3) // output: "5.450" NewFromFloat(545).StringFixed(-1) // output: "540"
Regardless of the UseScientificNotation option, the returned string will never be in scientific notation.
func (Decimal) StringFixedBank ¶
StringFixedBank returns a banker rounded fixed-point string with places digits after the decimal point.
Example:
NewFromFloat(0).StringFixedBank(2) // output: "0.00" NewFromFloat(0).StringFixedBank(0) // output: "0" NewFromFloat(5.45).StringFixedBank(0) // output: "5" NewFromFloat(5.45).StringFixedBank(1) // output: "5.4" NewFromFloat(5.45).StringFixedBank(2) // output: "5.45" NewFromFloat(5.45).StringFixedBank(3) // output: "5.450" NewFromFloat(545).StringFixedBank(-1) // output: "540"
Regardless of the UseScientificNotation option, the returned string will never be in scientific notation.
func (Decimal) StringFixedCash ¶
StringFixedCash returns a Swedish/Cash rounded fixed-point string. For more details see the documentation at function RoundCash.
Regardless of the UseScientificNotation option, the returned string will never be in scientific notation.
func (Decimal) StringScaled
deprecated
func (Decimal) Truncate ¶
Truncate truncates off digits from the number, without rounding.
If precision >= 0, it specifies the number of decimal places to keep. If precision < 0, it truncates the integer part to the nearest 10^(-precision) towards zero.
Example:
decimal.NewFromString("123.456").Truncate(2).String() // "123.45"
decimal.NewFromString("5432").Truncate(-2).String() // "5400"
decimal.NewFromString("-5432").Truncate(-2).String() // "-5400"
func (*Decimal) UnmarshalBinary ¶
UnmarshalBinary implements the encoding.BinaryUnmarshaler interface. As a string representation is already used when encoding to text, this method stores that string as []byte
func (*Decimal) UnmarshalJSON ¶
UnmarshalJSON implements the json.Unmarshaler interface.
func (*Decimal) UnmarshalText ¶
UnmarshalText implements the encoding.TextUnmarshaler interface for XML deserialization.
type NullDecimal ¶
NullDecimal represents a nullable decimal with compatibility for scanning null values from the database.
func NewNullDecimal ¶ added in v1.3.0
func NewNullDecimal(d Decimal) NullDecimal
NewNullDecimal returns a valid NullDecimal holding d.
func (*NullDecimal) DecodeSpanner ¶ added in v1.5.0
func (d *NullDecimal) DecodeSpanner(value interface{}) error
DecodeSpanner decodes a Spanner value into a Decimal
func (NullDecimal) EncodeSpanner ¶ added in v1.5.0
func (d NullDecimal) EncodeSpanner() (interface{}, error)
EncodeSpanner encodes a Decimal into a Spanner value
func (NullDecimal) MarshalJSON ¶
func (d NullDecimal) MarshalJSON() ([]byte, error)
MarshalJSON implements the json.Marshaler interface.
func (NullDecimal) MarshalText ¶ added in v1.3.0
func (d NullDecimal) MarshalText() (text []byte, err error)
MarshalText implements the encoding.TextMarshaler interface for XML serialization.
func (*NullDecimal) Scan ¶
func (d *NullDecimal) Scan(value interface{}) error
Scan implements the sql.Scanner interface for database deserialization.
func (*NullDecimal) UnmarshalJSON ¶
func (d *NullDecimal) UnmarshalJSON(decimalBytes []byte) error
UnmarshalJSON implements the json.Unmarshaler interface.
func (*NullDecimal) UnmarshalText ¶ added in v1.3.0
func (d *NullDecimal) UnmarshalText(text []byte) error
UnmarshalText implements the encoding.TextUnmarshaler interface for XML deserialization