6 个版本 (2 个稳定版)
1.0.1 | 2024年3月3日 |
---|---|
1.0.0 | 2023年10月5日 |
0.2.2 | 2021年12月16日 |
0.2.1 | 2020年9月11日 |
0.1.0 | 2020年7月13日 |
#8 in 值格式化
212,433 每月下载量
用于 280 个 Crates (16 直接)
160KB
3K SLoC
Ryū-js
Ryū-js 是 ryu crate 的一个分支,调整以符合 ECMAScript number-to-string 算法,也实现了符合 Number.prototype.toFixed()
转换的规范。
纯 Rust 实现的 Ryū,一种快速将浮点数转换为十进制字符串的算法。
PLDI'18 论文 Ryū: fast float-to-string conversion 由 Ulf Adams 撰写,包括该算法的完整正确性证明。该论文可在创意共享 CC-BY-SA 许可下获取。
此 Rust 实现是 Ulf Adams 在 C 中的实现逐行转换,https://github.com/ulfjack/ryu。
需求:此 crate 支持 rustc 1.64 以上的任何编译器版本;它不使用 Rust 标准库中的任何内容,因此可用于 no_std crates。
[dependencies]
ryu-js = "1.0"
示例
fn main() {
let mut buffer = ryu_js::Buffer::new();
let printed = buffer.format(1.234);
assert_eq!(printed, "1.234");
}
性能
您可以使用以下命令运行上游的基准测试:
$ git clone https://github.com/ulfjack/ryu c-ryu
$ cd c-ryu
$ bazel run -c opt //ryu/benchmark:ryu_benchmark
并且可以使用以下命令与我们的实现进行相同的基准测试:
$ git clone https://github.com/boa-dev/ryu-js rust-ryu
$ cd rust-ryu
$ cargo run --example upstream_benchmark --release
这些基准测试测量打印 32 位浮点数的平均时间和打印 64 位浮点数的平均时间,其中输入按 32 位和 64 位的均匀随机位模式分布。
上游 C 代码、不安全的直接 Rust 端口和安全的漂亮 Rust API 都表现相同,格式化 32 位浮点数大约需要 21 纳秒,格式化 64 位浮点数大约需要 31 纳秒。
此外,还有一个针对Rust的特定基准,比较了此实现与标准库,您可以使用它来运行
$ cargo bench
基准测试表明,在f32和f64输入的范围内,Ryū的速度大约比标准库快2-5倍。测量值是每迭代的纳秒数;越小越好。
格式化
与标准库的to_string相比,此库通常会产生更易于阅读的输出,因为它从不使用科学记数法。以下是两个示例
- ryu: 1.23e40, std: 12300000000000000000000000000000000000000
- ryu: 1.23e-40, std: 0.000000000000000000000000000000000000000123
这两个库都会打印不带科学记数法的短小数,如0.0000123。
许可
根据您的选择,此库受Apache License, Version 2.0或Boost Software License 1.0许可。除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以包含在此crate中的任何贡献,应如上双许可,不附加任何额外的条款或条件。