2个版本

使用旧的 Rust 2015

0.1.1 2017年11月20日
0.1.0 2017年5月17日

#integer-arithmetic中排名17

ISC许可证

21KB
383

修复

Crate version Build status

定点数类型。

文档


lib.rs:

定点数类型。

是什么?

定点数是一种具有固定小数点前后的数字数量的数字表示方法。这意味着范围是静态的,而不是像浮点数那样的动态。这也意味着它们可以用整数表示,其缩放由类型系统跟踪。

在这个库中,Fix的缩放由两个类型级别整数表示:基数和指数。任何底层整数原始类型都可以用来存储数字。可以对这些数字进行算术运算,并且可以将它们转换为不同的缩放指数。

为什么?

一个经典例子:让我们用浮点数计算10美分和20美分的总和。我们期望的结果是30美分。

assert_eq!(0.30, 0.10 + 0.20);

错误!我们得到了额外的四十万亿分之一美元。

assertion failed: `(left == right)` (left: `0.3`, right: `0.30000000000000004`)'

这是因为0.1和0.2都不能在二进制中精确表示,就像三分之一不能在十进制中精确表示一样。使用Fix,我们可以在编译时选择想要的精度。在这种情况下,美元的百分之一就足够了。

use fix::aliases::si::Centi; // Fix<_, U10, N2>
assert_eq!(Centi::new(0_30), Centi::new(0_10) + Centi::new(0_20));

但是,十进制对二进制计算机来说效率不高,对吧?乘以或除以10比位操作慢,但只有在移动小数点时才需要。使用Fix,这只需要通过convert方法显式完成。

use fix::aliases::si::{Centi, Milli};
assert_eq!(Milli::new(0_300), Centi::new(0_30).convert());

我们也可以轻松选择二进制缩放。

use fix::aliases::iec::{Kibi, Mebi};
assert_eq!(Kibi::new(1024), Mebi::new(1).convert());

还值得注意的是,在乘法和除法操作中,类型级别的缩放会发生变化,从而避免了任何隐式转换。

use fix::aliases::iec::{Gibi, Kibi, Mebi};
assert_eq!(Mebi::new(3), Gibi::new(6) / Kibi::new(2));

no_std

这个crate是no_std

i128支持

可以通过nightly Rust的i128 Cargo功能启用对u128i128的支持。

依赖关系

~155KB