像 `f64::from_str` 那样准确地计算 `n * 10^p` 吗?

Dog*_*ert 9 rust

我有两个值:n: f64p: i32,我需要计算n * 10^p

我尝试了两种方法:

  1. 使用乘法和 f64::powi
  2. 使用format!()f64::from_str

后者更准确(见下面的输出)但显然效率低下。有没有办法在不经过字符串转换的情况下获得相同的准确性?这是我的代码:

fn main() {
    let f1 = |n: f64, e: i32| n * 10f64.powi(e);
    let f2 = |n: f64, e: i32| format!("{}e{}", n, e).parse::<f64>().unwrap();
    for &n in &[1.1, 2.2, 3.3, 4.4] {
        for &e in &[-2, 2] {
            println!("{} {}", f1(n, e), f2(n, e));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

0.011000000000000001 0.011
110.00000000000001 110
0.022000000000000002 0.022
220.00000000000003 220
0.033 0.033
330 330
0.044000000000000004 0.044
440.00000000000006 440
Run Code Online (Sandbox Code Playgroud)

操场

小智 0

与往常一样,有一个板条箱: rust_decimal 它并不完全是您想要的,但它为您的任务添加了所需的精度,而无需进行格式化。也许可以尝试一下,不幸的是不可能在操场上使用它。