userver: decimal64::Decimal< Prec, RoundPolicy_ > Class Template Reference
Loading...
Searching...
No Matches
decimal64::Decimal< Prec, RoundPolicy_ > Class Template Reference

#include <userver/decimal64/decimal64.hpp>

Detailed Description

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
class decimal64::Decimal< Prec, RoundPolicy_ >

Fixed-point decimal data type for use in deterministic calculations, oftentimes involving money.

Template Parameters
PrecThe number of fractional digits
RoundPolicySpecifies how to round in lossy operations

Decimal is internally represented as int64_t. It means that it can be passed around by value. It also means that operations with huge numbers can overflow and trap. For example, with Prec == 6, the maximum representable number is about 10 trillion.

Decimal should be serialized and stored as a string, NOT as double. Use Decimal{str} constructor (or Decimal::FromStringPermissive if rounding is allowed) to read a Decimal, and ToString(dec) (or ToStringTrailingZeros(dec)/ToStringFixed<N>(dec)) to write a Decimal.

Use arithmetic with caution! Multiplication and division operations involve rounding. You may want to cast to Decimal with another Prec or RoundPolicy beforehand. For that purpose you can use decimal64::decimal_cast<NewDec>(dec).

Usage example:

// create a single alias instead of specifying Decimal everywhere
std::vector<std::string> cart = ...;
Money sum{0};
for (const std::string& cost_string : cart) {
// or use FromStringPermissive to enable rounding
sum += Money{cost_string};
}
return ToString(sum);

Definition at line 436 of file decimal64.hpp.

Public Types

using RoundPolicy = RoundPolicy_
 Specifies how to round in lossy operations.
 

Public Member Functions

constexpr Decimal () noexcept=default
 Zero by default.
 
template<typename Int , impl::EnableIfInt< Int > = 0>
constexpr Decimal (Int value)
 Convert from an integer.
 
constexpr Decimal (std::string_view value)
 Convert from a string.
 
template<int Prec2>
Decimaloperator= (Decimal< Prec2, RoundPolicy > rhs)
 Assignment from another Decimal
 
template<typename Int , impl::EnableIfInt< Int > = 0>
constexpr Decimaloperator= (Int rhs)
 Assignment from an integer.
 
constexpr bool operator== (Decimal rhs) const
 
constexpr bool operator!= (Decimal rhs) const
 
constexpr bool operator< (Decimal rhs) const
 
constexpr bool operator<= (Decimal rhs) const
 
constexpr bool operator> (Decimal rhs) const
 
constexpr bool operator>= (Decimal rhs) const
 
constexpr Decimal operator+ () const
 
constexpr Decimal operator- () const
 
template<int Prec2>
constexpr auto operator+ (Decimal< Prec2, RoundPolicy > rhs) const
 
template<typename Int , impl::EnableIfInt< Int > = 0>
constexpr Decimal operator+ (Int rhs) const
 
template<int Prec2>
constexpr Decimaloperator+= (Decimal< Prec2, RoundPolicy > rhs)
 
template<typename Int , impl::EnableIfInt< Int > = 0>
constexpr Decimaloperator+= (Int rhs)
 
template<int Prec2>
constexpr auto operator- (Decimal< Prec2, RoundPolicy > rhs) const
 
template<typename Int , impl::EnableIfInt< Int > = 0>
constexpr Decimal operator- (Int rhs) const
 
template<int Prec2>
constexpr Decimaloperator-= (Decimal< Prec2, RoundPolicy > rhs)
 
template<typename Int , impl::EnableIfInt< Int > = 0>
constexpr Decimaloperator-= (Int rhs)
 
template<typename Int , typename = impl::EnableIfInt<Int>>
constexpr Decimal operator* (Int rhs) const
 
template<typename Int , impl::EnableIfInt< Int > = 0>
constexpr Decimaloperator*= (Int rhs)
 
template<int Prec2>
constexpr Decimal operator* (Decimal< Prec2, RoundPolicy > rhs) const
 
template<int Prec2>
constexpr Decimaloperator*= (Decimal< Prec2, RoundPolicy > rhs)
 
template<typename Int , typename = impl::EnableIfInt<Int>>
constexpr Decimal operator/ (Int rhs) const
 
template<typename Int , typename = impl::EnableIfInt<Int>>
constexpr Decimaloperator/= (Int rhs)
 
template<int Prec2>
constexpr Decimal operator/ (Decimal< Prec2, RoundPolicy > rhs) const
 
template<int Prec2>
constexpr Decimaloperator/= (Decimal< Prec2, RoundPolicy > rhs)
 
constexpr int Sign () const
 Returns one of {-1, 0, +1}, depending on the sign of the Decimal
 
constexpr Decimal Abs () const
 Returns the absolute value of the Decimal
 
constexpr Decimal RoundToMultipleOf (Decimal base) const
 Rounds this to the nearest multiple of base according to RoundPolicy
 
constexpr int64_t ToInteger () const
 Returns the value rounded to integer using the active rounding policy.
 
constexpr double ToDoubleInexact () const
 Returns the value converted to double
 
constexpr int64_t AsUnbiased () const
 Retrieve the internal representation.
 

Static Public Member Functions

template<typename T >
static constexpr Decimal FromFloatInexact (T value)
 Lossy conversion from a floating-point number.
 
static constexpr Decimal FromStringPermissive (std::string_view input)
 Convert from a string, allowing rounding, spaces and boundary dot.
 
static constexpr Decimal FromUnbiased (int64_t value) noexcept
 Reconstruct from the internal representation, as acquired with AsUnbiased
 
static constexpr Decimal FromBiased (int64_t original_unbiased, int original_precision)
 Convert from original_unbiased / 10^original_precision, rounding according to RoundPolicy if necessary.
 

Static Public Attributes

static constexpr int kDecimalPoints = Prec
 The number of fractional digits.
 
static constexpr int64_t kDecimalFactor = kPow10<Prec>
 The denominator of the decimal fraction.
 

Member Typedef Documentation

◆ RoundPolicy

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
using decimal64::Decimal< Prec, RoundPolicy_ >::RoundPolicy = RoundPolicy_

Specifies how to round in lossy operations.

Definition at line 442 of file decimal64.hpp.

Constructor & Destructor Documentation

◆ Decimal() [1/2]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<typename Int , impl::EnableIfInt< Int > = 0>
constexpr decimal64::Decimal< Prec, RoundPolicy_ >::Decimal ( Int value)
inlineexplicitconstexpr

Convert from an integer.

Definition at line 452 of file decimal64.hpp.

◆ Decimal() [2/2]

template<int Prec, typename RoundPolicy >
constexpr decimal64::Decimal< Prec, RoundPolicy >::Decimal ( std::string_view value)
explicitconstexpr

Convert from a string.

The string must match the following regexp exactly:

[+-]?\d+(\.\d+)?

No extra characters, including spaces, are allowed. Extra leading and trailing zeros (within Prec) are discarded. Input containing more fractional digits that Prec is not allowed (no implicit rounding).

Exceptions
decimal64::ParseErroron invalid input
See also
FromStringPermissive

Definition at line 1220 of file decimal64.hpp.

Member Function Documentation

◆ Abs()

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
constexpr Decimal decimal64::Decimal< Prec, RoundPolicy_ >::Abs ( ) const
inlineconstexpr

Returns the absolute value of the Decimal

Definition at line 712 of file decimal64.hpp.

◆ AsUnbiased()

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
constexpr int64_t decimal64::Decimal< Prec, RoundPolicy_ >::AsUnbiased ( ) const
inlineconstexpr

Retrieve the internal representation.

The internal representation of Decimal is real_value * kDecimalFactor. Use for storing the value of Decimal efficiently when Prec is guaranteed not to change.

See also
FromUnbiased

Definition at line 758 of file decimal64.hpp.

◆ FromBiased()

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
static constexpr Decimal decimal64::Decimal< Prec, RoundPolicy_ >::FromBiased ( int64_t original_unbiased,
int original_precision )
inlinestaticconstexpr

Convert from original_unbiased / 10^original_precision, rounding according to RoundPolicy if necessary.

Usage examples:

Decimal<4>::FromBiased(123, 6) -> 0.0001
Decimal<4>::FromBiased(123, 2) -> 1.23
Decimal<4>::FromBiased(123, -1) -> 1230
Parameters
original_unbiasedThe original mantissa
original_precisionThe original precision (negated exponent)

Definition at line 524 of file decimal64.hpp.

◆ FromFloatInexact()

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<typename T >
static constexpr Decimal decimal64::Decimal< Prec, RoundPolicy_ >::FromFloatInexact ( T value)
inlinestaticconstexpr

Lossy conversion from a floating-point number.

To somewhat resist the accumulated error, the number is always rounded to the nearest Decimal, regardless of RoundPolicy.

Warning
Prefer storing and sending Decimal as string, and performing the computations between Decimals.

Definition at line 476 of file decimal64.hpp.

◆ FromStringPermissive()

template<int Prec, typename RoundPolicy >
constexpr Decimal< Prec, RoundPolicy > decimal64::Decimal< Prec, RoundPolicy >::FromStringPermissive ( std::string_view input)
staticconstexpr

Convert from a string, allowing rounding, spaces and boundary dot.

In addition to the Decimal(str) constructor, allows:

  • rounding (as per RoundPolicy), e.g. "12.3456789" with Prec == 2
  • space characters, e.g. " \t42 \n"
  • leading and trailing dot, e.g. "5." and ".5"
Exceptions
decimal64::ParseErroron invalid input
See also
Decimal(std::string_view)

Definition at line 1230 of file decimal64.hpp.

◆ FromUnbiased()

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
static constexpr Decimal decimal64::Decimal< Prec, RoundPolicy_ >::FromUnbiased ( int64_t value)
inlinestaticconstexprnoexcept

Reconstruct from the internal representation, as acquired with AsUnbiased

The Decimal value will be equal to value/kDecimalFactor.

See also
AsUnbiased

Definition at line 507 of file decimal64.hpp.

◆ operator!=()

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
constexpr bool decimal64::Decimal< Prec, RoundPolicy_ >::operator!= ( Decimal< Prec, RoundPolicy_ > rhs) const
inlineconstexpr

Definition at line 556 of file decimal64.hpp.

◆ operator*() [1/2]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<int Prec2>
constexpr Decimal decimal64::Decimal< Prec, RoundPolicy_ >::operator* ( Decimal< Prec2, RoundPolicy > rhs) const
inlineconstexpr

Definition at line 671 of file decimal64.hpp.

◆ operator*() [2/2]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<typename Int , typename = impl::EnableIfInt<Int>>
constexpr Decimal decimal64::Decimal< Prec, RoundPolicy_ >::operator* ( Int rhs) const
inlineconstexpr

Definition at line 651 of file decimal64.hpp.

◆ operator*=() [1/2]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<int Prec2>
constexpr Decimal & decimal64::Decimal< Prec, RoundPolicy_ >::operator*= ( Decimal< Prec2, RoundPolicy > rhs)
inlineconstexpr

Definition at line 676 of file decimal64.hpp.

◆ operator*=() [2/2]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<typename Int , impl::EnableIfInt< Int > = 0>
constexpr Decimal & decimal64::Decimal< Prec, RoundPolicy_ >::operator*= ( Int rhs)
inlineconstexpr

Definition at line 665 of file decimal64.hpp.

◆ operator+() [1/3]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
constexpr Decimal decimal64::Decimal< Prec, RoundPolicy_ >::operator+ ( ) const
inlineconstexpr

Definition at line 567 of file decimal64.hpp.

◆ operator+() [2/3]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<int Prec2>
constexpr auto decimal64::Decimal< Prec, RoundPolicy_ >::operator+ ( Decimal< Prec2, RoundPolicy > rhs) const
inlineconstexpr

Definition at line 575 of file decimal64.hpp.

◆ operator+() [3/3]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<typename Int , impl::EnableIfInt< Int > = 0>
constexpr Decimal decimal64::Decimal< Prec, RoundPolicy_ >::operator+ ( Int rhs) const
inlineconstexpr

Definition at line 590 of file decimal64.hpp.

◆ operator+=() [1/2]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<int Prec2>
constexpr Decimal & decimal64::Decimal< Prec, RoundPolicy_ >::operator+= ( Decimal< Prec2, RoundPolicy > rhs)
inlineconstexpr

Definition at line 600 of file decimal64.hpp.

◆ operator+=() [2/2]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<typename Int , impl::EnableIfInt< Int > = 0>
constexpr Decimal & decimal64::Decimal< Prec, RoundPolicy_ >::operator+= ( Int rhs)
inlineconstexpr

Definition at line 607 of file decimal64.hpp.

◆ operator-() [1/3]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
constexpr Decimal decimal64::Decimal< Prec, RoundPolicy_ >::operator- ( ) const
inlineconstexpr

Definition at line 569 of file decimal64.hpp.

◆ operator-() [2/3]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<int Prec2>
constexpr auto decimal64::Decimal< Prec, RoundPolicy_ >::operator- ( Decimal< Prec2, RoundPolicy > rhs) const
inlineconstexpr

Definition at line 613 of file decimal64.hpp.

◆ operator-() [3/3]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<typename Int , impl::EnableIfInt< Int > = 0>
constexpr Decimal decimal64::Decimal< Prec, RoundPolicy_ >::operator- ( Int rhs) const
inlineconstexpr

Definition at line 628 of file decimal64.hpp.

◆ operator-=() [1/2]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<int Prec2>
constexpr Decimal & decimal64::Decimal< Prec, RoundPolicy_ >::operator-= ( Decimal< Prec2, RoundPolicy > rhs)
inlineconstexpr

Definition at line 638 of file decimal64.hpp.

◆ operator-=() [2/2]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<typename Int , impl::EnableIfInt< Int > = 0>
constexpr Decimal & decimal64::Decimal< Prec, RoundPolicy_ >::operator-= ( Int rhs)
inlineconstexpr

Definition at line 645 of file decimal64.hpp.

◆ operator/() [1/2]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<int Prec2>
constexpr Decimal decimal64::Decimal< Prec, RoundPolicy_ >::operator/ ( Decimal< Prec2, RoundPolicy > rhs) const
inlineconstexpr

Definition at line 698 of file decimal64.hpp.

◆ operator/() [2/2]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<typename Int , typename = impl::EnableIfInt<Int>>
constexpr Decimal decimal64::Decimal< Prec, RoundPolicy_ >::operator/ ( Int rhs) const
inlineconstexpr

Definition at line 682 of file decimal64.hpp.

◆ operator/=() [1/2]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<int Prec2>
constexpr Decimal & decimal64::Decimal< Prec, RoundPolicy_ >::operator/= ( Decimal< Prec2, RoundPolicy > rhs)
inlineconstexpr

Definition at line 703 of file decimal64.hpp.

◆ operator/=() [2/2]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<typename Int , typename = impl::EnableIfInt<Int>>
constexpr Decimal & decimal64::Decimal< Prec, RoundPolicy_ >::operator/= ( Int rhs)
inlineconstexpr

Definition at line 692 of file decimal64.hpp.

◆ operator<()

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
constexpr bool decimal64::Decimal< Prec, RoundPolicy_ >::operator< ( Decimal< Prec, RoundPolicy_ > rhs) const
inlineconstexpr

Definition at line 558 of file decimal64.hpp.

◆ operator<=()

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
constexpr bool decimal64::Decimal< Prec, RoundPolicy_ >::operator<= ( Decimal< Prec, RoundPolicy_ > rhs) const
inlineconstexpr

Definition at line 560 of file decimal64.hpp.

◆ operator=() [1/2]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<int Prec2>
Decimal & decimal64::Decimal< Prec, RoundPolicy_ >::operator= ( Decimal< Prec2, RoundPolicy > rhs)
inline

Assignment from another Decimal

The assignment is allowed as long as RoundPolicy is the same. Rounding will be performed according to RoundPolicy if necessary.

Definition at line 539 of file decimal64.hpp.

◆ operator=() [2/2]

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<typename Int , impl::EnableIfInt< Int > = 0>
constexpr Decimal & decimal64::Decimal< Prec, RoundPolicy_ >::operator= ( Int rhs)
inlineconstexpr

Assignment from an integer.

Definition at line 546 of file decimal64.hpp.

◆ operator==()

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
constexpr bool decimal64::Decimal< Prec, RoundPolicy_ >::operator== ( Decimal< Prec, RoundPolicy_ > rhs) const
inlineconstexpr

Definition at line 554 of file decimal64.hpp.

◆ operator>()

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
constexpr bool decimal64::Decimal< Prec, RoundPolicy_ >::operator> ( Decimal< Prec, RoundPolicy_ > rhs) const
inlineconstexpr

Definition at line 562 of file decimal64.hpp.

◆ operator>=()

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
constexpr bool decimal64::Decimal< Prec, RoundPolicy_ >::operator>= ( Decimal< Prec, RoundPolicy_ > rhs) const
inlineconstexpr

Definition at line 564 of file decimal64.hpp.

◆ RoundToMultipleOf()

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
constexpr Decimal decimal64::Decimal< Prec, RoundPolicy_ >::RoundToMultipleOf ( Decimal< Prec, RoundPolicy_ > base) const
inlineconstexpr

Rounds this to the nearest multiple of base according to RoundPolicy

Definition at line 715 of file decimal64.hpp.

◆ Sign()

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
constexpr int decimal64::Decimal< Prec, RoundPolicy_ >::Sign ( ) const
inlineconstexpr

Returns one of {-1, 0, +1}, depending on the sign of the Decimal

Definition at line 709 of file decimal64.hpp.

◆ ToDoubleInexact()

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
constexpr double decimal64::Decimal< Prec, RoundPolicy_ >::ToDoubleInexact ( ) const
inlineconstexpr

Returns the value converted to double

Warning
Operations with double, and even the returned value, is inexact. Prefer storing and sending Decimal as string, and performing the computations between Decimals.
See also
FromFloatInexact

Definition at line 730 of file decimal64.hpp.

◆ ToInteger()

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
constexpr int64_t decimal64::Decimal< Prec, RoundPolicy_ >::ToInteger ( ) const
inlineconstexpr

Returns the value rounded to integer using the active rounding policy.

Definition at line 721 of file decimal64.hpp.

Friends And Related Symbol Documentation

◆ Decimal

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<int Prec2, typename RoundPolicy2 >
friend class Decimal
friend

Definition at line 777 of file decimal64.hpp.

◆ decimal_cast

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<typename T , int OldPrec, typename OldRound >
constexpr T decimal_cast ( Decimal< OldPrec, OldRound > arg)
friend

Cast one Decimal to another Decimal type.

When casting to a Decimal with a lower Prec, rounding is performed according to the new RoundPolicy.

Usage example:

using Money = decimal64::Decimal<4>;
Money cost = ...;
auto discount = decimal64::decimal_cast<Discount>(cost) * Discount{"0.05"};

Definition at line 813 of file decimal64.hpp.

◆ operator*

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<typename Int , impl::EnableIfInt< Int > = 0>
constexpr Decimal operator* ( Int lhs,
Decimal< Prec, RoundPolicy_ > rhs )
friend

Definition at line 660 of file decimal64.hpp.

◆ operator+

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<typename Int , impl::EnableIfInt< Int > = 0>
constexpr Decimal operator+ ( Int lhs,
Decimal< Prec, RoundPolicy_ > rhs )
friend

Definition at line 595 of file decimal64.hpp.

◆ operator-

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<typename Int , impl::EnableIfInt< Int > = 0>
constexpr Decimal operator- ( Int lhs,
Decimal< Prec, RoundPolicy_ > rhs )
friend

Definition at line 633 of file decimal64.hpp.

◆ operator/

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
template<typename Int , typename = impl::EnableIfInt<Int>>
constexpr Decimal operator/ ( Int lhs,
Decimal< Prec, RoundPolicy_ > rhs )
friend

Definition at line 687 of file decimal64.hpp.

Member Data Documentation

◆ kDecimalFactor

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
constexpr int64_t decimal64::Decimal< Prec, RoundPolicy_ >::kDecimalFactor = kPow10<Prec>
staticconstexpr

The denominator of the decimal fraction.

Definition at line 445 of file decimal64.hpp.

◆ kDecimalPoints

template<int Prec, typename RoundPolicy_ = DefRoundPolicy>
constexpr int decimal64::Decimal< Prec, RoundPolicy_ >::kDecimalPoints = Prec
staticconstexpr

The number of fractional digits.

Definition at line 439 of file decimal64.hpp.


The documentation for this class was generated from the following file: