#string-conversion #float #floating-point #javascript #compliant #formatting #numbers

无需 std ryu-js

快速浮点数到字符串转换,符合 ECMAScript 规范

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 值格式化

Download history 31655/week @ 2024-05-01 32505/week @ 2024-05-08 37154/week @ 2024-05-15 38706/week @ 2024-05-22 29875/week @ 2024-05-29 36075/week @ 2024-06-05 48142/week @ 2024-06-12 38353/week @ 2024-06-19 36254/week @ 2024-06-26 49823/week @ 2024-07-03 61589/week @ 2024-07-10 53281/week @ 2024-07-17 36486/week @ 2024-07-24 51671/week @ 2024-07-31 55281/week @ 2024-08-07 59400/week @ 2024-08-14

212,433 每月下载量
用于 280 个 Crates (16 直接)

Apache-2.0 OR BSL-1.0

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.0Boost Software License 1.0许可。
除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以包含在此crate中的任何贡献,应如上双许可,不附加任何额外的条款或条件。

依赖项