如何将浮点数格式化为第一个有效小数并具有指定的精度

Ric*_*nho 4 rust

我是 Rust 新手(并且有 Javascript 背景),因此我决定构建一个数字格式化应用程序来了解更多信息。

应用程序中的一个函数可以接受一个微小的浮点(例如0.000435)和一个精度值(例如2),并且应该返回格式化为第一个有效小数并应用指定精度的浮点(例如0.00044

例如,该函数应接受并返回以下内容:

  fn meh(float: f64, precision: usize) -> String {
    // ... magic happens ... format!(...
  }

  let float = 0.000456;
  let precision = 2:
  let result_a = meh(float, precision);
  // result_a => "0.00046"

  let float = 0.043256;
  let precision = 3:
  let result_b = meh(float, precision);
  // result_b => "0.0433"
Run Code Online (Sandbox Code Playgroud)

我知道这format!有助于提高精度。但我找不到一种合适的方法来找到第一个有效小数,而不做一些有趣的事情,比如“将 float 转换为 aString并迭代直到找到非零值......”

我希望这是有道理的,任何帮助将不胜感激。

Frx*_*rem 8

正如评论中提到的,Rust 对“精度”的解释是“小数点后的位数”。但是,如果我们希望它表示“有效位数”,我们可以编写函数meh来考虑这一点:

fn meh(float: f64, precision: usize) -> String {
    // compute absolute value
    let a = float.abs();

    // if abs value is greater than 1, then precision becomes less than "standard"
    let precision = if a >= 1. {
        // reduce by number of digits, minimum 0
        let n = (1. + a.log10().floor()) as usize;
        if n <= precision {
            precision - n
        } else {
            0
        }
    // if precision is less than 1 (but non-zero), then precision becomes greater than "standard"
    } else if a > 0. {
        // increase number of digits
        let n = -(1. + a.log10().floor()) as usize;
        precision + n
    // special case for 0
    } else {
        0
    };

    // format with the given computed precision
    format!("{0:.1$}", float, precision)
}
Run Code Online (Sandbox Code Playgroud)

带有测试用例的 Playground 示例