gpt4 book ai didi

rust - 如何将 float 格式化为第一位有效小数并具有指定的精度

转载 作者:行者123 更新时间:2023-12-03 11:29:05 55 4
gpt4 key购买 nike

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

应用程序中的一个函数可以接受一个微小的 float (例如 0.000435)和一个精度值(例如 2),并且应该返回格式化为第一个 float 有效小数并应用指定的精度(例如 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"

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

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

最佳答案

正如评论中提到的,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)
}

Playground example with test cases

关于rust - 如何将 float 格式化为第一位有效小数并具有指定的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60497397/

55 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com