如何将浮点数四舍五入到指定位数?

How does one round a floating point number to a specified number of digits?

Rust中如何将f64浮点数四舍五入到指定位数?

如果您只想将其用于显示目的,请使用 formatting syntax built into println!()。例如,要打印四舍五入到小数点后两位的数字,请使用 {:.2} 格式说明符:

fn main() {
    let x = 12.34567;
    println!("{:.2}", x);
}

如果要将四舍五入的数字放入字符串中,请使用 format!() macro

如果你想舍入一个数字并将结果作为另一个数字返回,然后将该数字乘以给定的 10 次方,调用 round,然后除以相同的次方,例如要舍入到小数点后两位,请使用 102 = 100.

fn main() {
    let x = 12.34567_f64;
    let y = (x * 100.0).round() / 100.0;

    println!("{:.5} {:.5}", x, y);
}

playground

这会打印 12.34567 12.35000

如果在编译时不知道小数位数,可以使用 powi 来有效地计算相关的幂。

请注意,这将细分为非常大的数字;具体来说,大于 std::f64::MAX / power 的数字(其中 power 是十的次方,例如上例中的 100)将在乘法中变为无穷大,并在乘法之后保持无穷大。但是,f64 不能表示大于 253 的任何小数位(即它们始终是整数),因此可以将如此大的数字特例化为 return他们自己。

添加到@huon 的好答案中,如果你想为显示目的舍入一个浮点数,但你不知道编译时的精度,你可以使用如下精确格式化语法:

fn main() {
    let precision = 3;
    let x = 12.34567;
    println!("{:.1$}", x, precision); // prints 12.346 and works with `format!` as well
}

std::fmt 的文档有更多语法示例。

如果不需要打印,使用math::round。来自 libmath.

https://docs.rs/libmath/0.1.4/math/round/index.html

use math::round;

let rounded = round::floor(3.14159, 3);
assert_eq!(rounded, 3.141);

let rounded = round::ceil(3.14159, 3);
assert_eq!(rounded, 3.142);