9 个版本
0.1.8 | 2024年4月29日 |
---|---|
0.1.7 | 2024年4月21日 |
0.1.1 | 2024年3月18日 |
在 数据结构 中排名第 547
每月下载量 73
29KB
717 行
Fix
支持 Solana Anchor 的定点数类型。
文档
lib.rs
:
定点数类型。
是什么?
定点数是一种具有固定小数点前后数字数量的数值表示方法。这意味着范围是静态的,而不是动态的,就像浮点数一样。这也意味着它们可以作为整数表示,其比例由类型系统跟踪。
在这个库中,Fix
的比例由两个类型级整数表示:基数和指数。任何底层整数原语都可以用来存储数字。可以在这些数字上执行算术运算,并且可以将它们转换为不同的比例指数。
为什么?
一个经典的例子:让我们用浮点数计算10美分和20美分的总和。我们期望得到30美分的结果。
assert_eq!(0.30, 0.10 + 0.20);
错误!我们得到了额外的四千亿分之一美元。
assertion failed: `(left == right)` (left: `0.3`, right: `0.30000000000000004`)'
这是由于 neither 0.1 nor 0.2 在二进制中不能精确表示,就像三分之十不能在十进制中表示一样。使用 Fix
,我们可以在编译时选择我们想要的精度,在这种情况下,美分的百分之一将 suffice。
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
。
依赖项
~0.3–10MB
~94K SLoC