Expand description
dec is a decimal arithmetic library for Rust.
Introduction
From the Decimal Arithmetic FAQ:
Most people in the world use decimal (base 10) arithmetic. When large or small values are needed, exponents which are powers of ten are used. However, most computers have only binary (base two) arithmetic, and when exponents are used (in floatingpoing numbers) they are powers of two.
Binary floatingpoint numbers can only approximate common decimal numbers. The value 0.1, for example, would need an infinitely recurring binary fraction. In contrast, a decimal number system can represent 0.1 exactly, as one tenth (that is, 10^{1}). Consequently, binary floatingpoint cannot be used for financial calculations, or indeed for any calculations where the results achieved are required to match those which might be calculated by hand.
dec is an implementation of the General Decimal Arithmetic standard, which precisely describes both a limitedprecision floatingpoint decimal arithmetic and an arbitrary precision floatingpoint decimal arithmetic.
The latest draft of the standard is available online at http://speleotrove.com/decimal/decarith.html. The floatingpoint arithmetic additionally conforms to the IEEE 7542008 specification, but this specification is not freely available.
Details
dec is a safe Rust API atop the C reference implementation, libdecnumber. Unsafe C bindings to libdecnumber are available in the decnumbersys crate.
The main types exposed by this library are as follows:

Decimal32
, a 32bit decimal floatingpoint representation which provides 7 decimal digits of precision in a compressed format. This type is intended for storage and interchange only and so does not support any arithmetic functions. 
Decimal64
, a 64bit decimal floatingpoint representation which provides 16 decimal digits of precision in a compressed format along with various arithmetic functions. 
Decimal128
, a 128bit decimal floatingpoint representation which provides 34 decimal digits of precision in a compressed format along with various arithmetic functions. 
Decimal
, a decimal representation whose precision is configurable via its genericN
parameter. 
Context
, which hosts most of the actual functions on the above types. A context configures the behavior of the various operations (e.g., rounding mode) and accumulates exceptional conditions (e.g., overflow).
Examples
The following example demonstrates the basic usage of the library:
use dec::Decimal128;
let x: Decimal128 = ".1".parse()?;
let y: Decimal128 = ".2".parse()?;
let z: Decimal128 = ".3".parse()?;
assert_eq!(x + y, z);
assert_eq!((x + y + z).to_string(), "0.6");
Modules
 Provides a target for
serde(with = ...)
that permits deserializingDecimal
values from primitive integers,Strings
, orstr
.
Structs
 A context for performing decimal operations.
 An arbitraryprecision decimal number.
 A 32bit decimal floatingpoint number.
 A 64bit decimal floatingpoint number.
 A 128bit decimal floatingpoint number.
 An error indicating that a minimum exponent or maximum exponent is not valid for a given context.
 An error indicating that a precision is not valid for a given context.
 An error indicating that a string is not a valid decimal number.
 Represents exceptional conditions resulting from operations on decimal numbers.
 An error indicating that a value cannot be cast to a primitive type.
Enums
 The class of a decimal number.
 Algorithms for rounding decimal numbers.