18 releases
0.4.9  Nov 11, 2023 

0.4.8  Feb 5, 2022 
0.4.7  Jan 15, 2022 
0.4.5  Jul 29, 2021 
0.3.3  Mar 10, 2021 
#116 in Algorithms
16,549 downloads per month
Used in 10 crates
(3 directly)
1MB
15K
SLoC
rustdec
libdecnumber bindings for the Rust programming language.
dec
A decimal arithmetic library providing highlevel, safe bindings to libdecnumber.
# Cargo.toml
[dependencies]
dec = "0.4.9"
decnumbersys
Lowlevel bindings to libdecnumber.
# Cargo.toml
[dependencies]
decnumbersys = "0.1.5"
lib.rs
:
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");