Documentation ¶
Overview ¶
package fixed implements a fixed-point number, where both mantissa and exponent are stored in a single number. Can be used to represent currency rates with up to 16 digits of precision.
Index ¶
- Constants
- Variables
- type Value
- func (v Value) Add(other Value) Value
- func (v Value) Cmp(other Value) int
- func (v Value) Eq(other Value) bool
- func (v Value) Float64() float64
- func (v Value) GoString() string
- func (v Value) MantUint64() uint64
- func (v Value) MarshalJSON() ([]byte, error)
- func (v Value) Normalized() Value
- func (v Value) String() string
- func (v Value) ToExp(exp int) Value
- func (v Value) Uint64() uint64
- func (v *Value) UnmarshalJSON(data []byte) error
Examples ¶
Constants ¶
const ( // JSONModeString produces values as strings, like `"1234.5678"` JSONModeString = iota // JSONModeFloat marshals values as floats, like `1234.5678`. JSONModeFloat // JSONModeME marshals values with mantissa and exponent, like `{"m":123,"e":-5}`. JSONModeME // JSONModeCompact will choose the shortest form between JSONModeString and JSONModeME. JSONModeCompact )
const ( // Max is the maximum possible fixed-point value. Max = Value(number(maxExponent)<<mantBits | (maxMantissa & mantMask)) // Min is the minimum possible fixed-point value. Min = Value(number((1<<(expBits-1)+1))<<mantBits | minMantissa) )
Variables ¶
var ( // JSONMode defines the way all values are marshaled into json, see JSONMode* constants. // This variable is not thread-safe, so this should be changed on program start. JSONMode = JSONModeCompact )
Functions ¶
This section is empty.
Types ¶
type Value ¶
type Value number
Value is a positive fixed-point number. It currently uses a uint64 value as a data type, where 8 bits are used for exponent and 56 for mantissa.
63 55 0 ________|_______________________________________________________ mmmmmmmmeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
Negative numbers aren't currently supported. Value can be useful for representing numbers like prices in financial services.
Example ¶
v1, err := FromString("1.23456") if err != nil { panic(err) } fmt.Printf("v1 as a float = %v, mantissa = %v, uint64 = %v\n", v1.Float64(), v1.MantUint64(), v1.Uint64()) v2, err := FromFloat64(1.23456) if err != nil { panic(err) } fmt.Printf("value from string: %s, value from float: %s, values are equal: %v\n", v1.String(), v2.String(), v1.Eq(v2)) v3, err := FromMantAndExp(12345, -4) if err != nil { panic(err) } fmt.Printf("uint64 values for -6 exp %d, %d\n", v1.ToExp(-6).MantUint64(), v3.ToExp(-6).MantUint64()) data, err := json.Marshal(v1) if err != nil { panic(err) } fmt.Printf("json for value: %s\n", string(data)) JSONMode = JSONModeME data, err = json.Marshal(v1) if err != nil { panic(err) } fmt.Printf("json for value and JSONModeME: %s\n", string(data)) v4, err := FromString("1234560") if err != nil { panic(err) } fmt.Printf("%s + %s = %s", v4.String(), v1.String(), v4.Add(v1).String())
Output: v1 as a float = 1.23456, mantissa = 123456, uint64 = 1 value from string: 1.23456, value from float: 1.23456, values are equal: true uint64 values for -6 exp 1234560, 1234500 json for value: "1.23456" json for value and JSONModeME: {"m":123456,"e":-5} 1234560 + 1.23456 = 1234561.23456
func FromFloat64 ¶
FromFloat64 returns a value for given float64. Returns an error for nagative values, infinities, and not-a-numbers.
func FromMantAndExp ¶
FromMantAndExp returns a value for given mantissa and exponent. Returns an error, if (mant, exp) pair represents a number out of range.
func FromUint64 ¶
FromUint64 returns a value for given uint64 number. Returns an error if v if exceeds the maximum mantissa.
func (Value) Add ¶ added in v0.4.0
Add sums two values. If the resulting mantissa overflows maxMantissa, the least significant digits will be truncated. If the result overflows Max, Max is returned.
func (Value) Cmp ¶ added in v0.3.0
Cmp compares two values. Returns -1 if a < b, 0 if a == b, 1 if a > b
func (Value) MarshalJSON ¶
MarshalJSON marshals value according to current JSONMode. See JSONMode and JSONMode* constants.
func (Value) Normalized ¶
Normalized eliminates trailing zeros in the fractional part. The process basically inceases the exponent, and stops, if it reaches its maximum value, so that it is possible, that that mantissa has trailing zeros.
func (Value) ToExp ¶
ToExp changes the mantissa of v so, that v = m * 10e'exp'. As a result, mantissa can lose some digits in precision, become zero, or Max.
func (*Value) UnmarshalJSON ¶
UnmarshalJSON unmarshals a string, float, or an object into a value.