如何以指定的精度将浮点设置为第一个有效小数

  • 本文关键字:设置 第一个 小数 有效 精度 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"

我知道format!有助于提高精度。但我找不到一种找到第一个有效小数的好方法,不做一些有趣的事情,比如"将浮点转换为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)
}

带有测试用例的游乐场示例

相关内容

  • 没有找到相关文章

最新更新