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

#include <userver/decimal64/decimal64.hpp>

Detailed Description

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

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 and exponential format are 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 449 of file decimal64.hpp.

Public Types

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

Public Member Functions

constexpr Decimal () noexcept=default
 Zero by default.
 
template<meta::kIsInteger Int>
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<meta::kIsInteger Int>
constexpr Decimaloperator= (Int rhs)
 Assignment from an integer.
 
constexpr auto operator<=> (const Decimal &rhs) const =default
 
constexpr Decimal operator+ () const
 
constexpr Decimal operator- () const
 
template<int Prec2>
constexpr auto operator+ (Decimal< Prec2, RoundPolicy > rhs) const
 
template<meta::kIsInteger Int>
constexpr Decimal operator+ (Int rhs) const
 
template<int Prec2>
constexpr Decimaloperator+= (Decimal< Prec2, RoundPolicy > rhs)
 
template<meta::kIsInteger Int>
constexpr Decimaloperator+= (Int rhs)
 
template<int Prec2>
constexpr auto operator- (Decimal< Prec2, RoundPolicy > rhs) const
 
template<meta::kIsInteger Int>
constexpr Decimal operator- (Int rhs) const
 
template<int Prec2>
constexpr Decimaloperator-= (Decimal< Prec2, RoundPolicy > rhs)
 
template<meta::kIsInteger Int>
constexpr Decimaloperator-= (Int rhs)
 
template<meta::kIsInteger Int>
constexpr Decimal operator* (Int rhs) const
 
template<meta::kIsInteger 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)
 
template<meta::kIsInteger Int>
constexpr Decimal operator/ (Int rhs) const
 
template<meta::kIsInteger 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 TRoundPolicy = DefRoundPolicy>
using decimal64::Decimal< Prec, TRoundPolicy >::RoundPolicy = TRoundPolicy

Specifies how to round in lossy operations.

Definition at line 455 of file decimal64.hpp.

Constructor & Destructor Documentation

◆ Decimal() [1/2]

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
template<meta::kIsInteger Int>
decimal64::Decimal< Prec, TRoundPolicy >::Decimal ( Int value)
inlineexplicitconstexpr

Convert from an integer.

Definition at line 465 of file decimal64.hpp.

◆ Decimal() [2/2]

template<int Prec, typename RoundPolicy>
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). Exponential format (e.g., "1.23e4", "5E-2") is not supported by this constructor.

Exceptions
decimal64::ParseErroron invalid input
See also
FromStringPermissive

Definition at line 1452 of file decimal64.hpp.

Member Function Documentation

◆ Abs()

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

Returns the absolute value of the Decimal

Definition at line 718 of file decimal64.hpp.

◆ AsUnbiased()

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
int64_t decimal64::Decimal< Prec, TRoundPolicy >::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 766 of file decimal64.hpp.

◆ FromBiased()

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
static constexpr Decimal decimal64::Decimal< Prec, TRoundPolicy >::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 542 of file decimal64.hpp.

◆ FromFloatInexact()

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
template<typename T>
static constexpr Decimal decimal64::Decimal< Prec, TRoundPolicy >::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 493 of file decimal64.hpp.

◆ FromStringPermissive()

template<int Prec, typename RoundPolicy>
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"
  • exponential format, e.g. "1.23e4" -> 12300, "5E-2" -> 0.05
Exceptions
decimal64::ParseErroron invalid input
See also
Decimal(std::string_view)

Definition at line 1462 of file decimal64.hpp.

◆ FromUnbiased()

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
static constexpr Decimal decimal64::Decimal< Prec, TRoundPolicy >::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 525 of file decimal64.hpp.

◆ operator*() [1/2]

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

Definition at line 677 of file decimal64.hpp.

◆ operator*() [2/2]

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
template<meta::kIsInteger Int>
Decimal decimal64::Decimal< Prec, TRoundPolicy >::operator* ( Int rhs) const
inlineconstexpr

Definition at line 657 of file decimal64.hpp.

◆ operator*=() [1/2]

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

Definition at line 682 of file decimal64.hpp.

◆ operator*=() [2/2]

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
template<meta::kIsInteger Int>
Decimal & decimal64::Decimal< Prec, TRoundPolicy >::operator*= ( Int rhs)
inlineconstexpr

Definition at line 671 of file decimal64.hpp.

◆ operator+() [1/3]

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

Definition at line 571 of file decimal64.hpp.

◆ operator+() [2/3]

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

Definition at line 581 of file decimal64.hpp.

◆ operator+() [3/3]

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
template<meta::kIsInteger Int>
Decimal decimal64::Decimal< Prec, TRoundPolicy >::operator+ ( Int rhs) const
inlineconstexpr

Definition at line 596 of file decimal64.hpp.

◆ operator+=() [1/2]

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

Definition at line 606 of file decimal64.hpp.

◆ operator+=() [2/2]

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
template<meta::kIsInteger Int>
Decimal & decimal64::Decimal< Prec, TRoundPolicy >::operator+= ( Int rhs)
inlineconstexpr

Definition at line 613 of file decimal64.hpp.

◆ operator-() [1/3]

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

Definition at line 573 of file decimal64.hpp.

◆ operator-() [2/3]

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

Definition at line 619 of file decimal64.hpp.

◆ operator-() [3/3]

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
template<meta::kIsInteger Int>
Decimal decimal64::Decimal< Prec, TRoundPolicy >::operator- ( Int rhs) const
inlineconstexpr

Definition at line 634 of file decimal64.hpp.

◆ operator-=() [1/2]

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

Definition at line 644 of file decimal64.hpp.

◆ operator-=() [2/2]

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
template<meta::kIsInteger Int>
Decimal & decimal64::Decimal< Prec, TRoundPolicy >::operator-= ( Int rhs)
inlineconstexpr

Definition at line 651 of file decimal64.hpp.

◆ operator/() [1/2]

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

Definition at line 704 of file decimal64.hpp.

◆ operator/() [2/2]

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
template<meta::kIsInteger Int>
Decimal decimal64::Decimal< Prec, TRoundPolicy >::operator/ ( Int rhs) const
inlineconstexpr

Definition at line 688 of file decimal64.hpp.

◆ operator/=() [1/2]

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

Definition at line 709 of file decimal64.hpp.

◆ operator/=() [2/2]

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
template<meta::kIsInteger Int>
Decimal & decimal64::Decimal< Prec, TRoundPolicy >::operator/= ( Int rhs)
inlineconstexpr

Definition at line 698 of file decimal64.hpp.

◆ operator=() [1/2]

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
template<int Prec2>
Decimal & decimal64::Decimal< Prec, TRoundPolicy >::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 557 of file decimal64.hpp.

◆ operator=() [2/2]

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
template<meta::kIsInteger Int>
Decimal & decimal64::Decimal< Prec, TRoundPolicy >::operator= ( Int rhs)
inlineconstexpr

Assignment from an integer.

Definition at line 564 of file decimal64.hpp.

◆ RoundToMultipleOf()

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

Rounds this to the nearest multiple of base according to RoundPolicy

Definition at line 721 of file decimal64.hpp.

◆ Sign()

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

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

Definition at line 715 of file decimal64.hpp.

◆ ToDoubleInexact()

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
double decimal64::Decimal< Prec, TRoundPolicy >::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 738 of file decimal64.hpp.

◆ ToInteger()

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

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

Definition at line 729 of file decimal64.hpp.

Friends And Related Symbol Documentation

◆ Decimal

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

Definition at line 785 of file decimal64.hpp.

◆ decimal_cast

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
template<typename T, int OldPrec, typename OldRound>
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 825 of file decimal64.hpp.

◆ operator*

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
template<meta::kIsInteger Int>
Decimal operator* ( Int lhs,
Decimal< Prec, TRoundPolicy > rhs )
friend

Definition at line 666 of file decimal64.hpp.

◆ operator+

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
template<meta::kIsInteger Int>
Decimal operator+ ( Int lhs,
Decimal< Prec, TRoundPolicy > rhs )
friend

Definition at line 601 of file decimal64.hpp.

◆ operator-

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
template<meta::kIsInteger Int>
Decimal operator- ( Int lhs,
Decimal< Prec, TRoundPolicy > rhs )
friend

Definition at line 639 of file decimal64.hpp.

◆ operator/

template<int Prec, typename TRoundPolicy = DefRoundPolicy>
template<meta::kIsInteger Int>
Decimal operator/ ( Int lhs,
Decimal< Prec, TRoundPolicy > rhs )
friend

Definition at line 693 of file decimal64.hpp.

Member Data Documentation

◆ kDecimalFactor

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

The denominator of the decimal fraction.

Definition at line 458 of file decimal64.hpp.

◆ kDecimalPoints

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

The number of fractional digits.

Definition at line 452 of file decimal64.hpp.


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