如何将 `f64` 转换为 `f32`?

9

如何将 f64 转换为最接近的 f32

目前没有提供 FromTryFrom 实现,可能是因为这样的实现仅适用于无损转换。我还在 f64 文档和 f32 文档中搜索了与另一数据类型有关的内容,但没有找到相关参考。

    let double: f64 = 0.;

    // doesn't work
    // let single: f32 = double.into();
    // let single: f32 = double.try_into().unwrap();
1个回答

15
在这种情况下,我们可以使用as关键字进行转换。通常不希望对整数进行强制类型转换,因为“从较大的整数到较小的整数(例如 u32 -> u8)的转换将截断”,这通常是不想要的。但是,对于f64f32 的转换非常明智: 转换从f64到f32会产生最接近的可能的f32 如果需要,舍入按照roundTiesToEven模式进行 在溢出的情况下,会生成与输入具有相同符号的无穷大。 参考来源: Rust 参考文档
    let double: f64 = 42.;
    dbg!(double as f32);
[src/main.rs:13] double as f32 = 42.0

如果不希望出现无限溢出并且想要触发 panic,最简单的解决方案可能是检查 is_finite

fn f64_to_f32(x: f64) -> f32 {
    let y = x as f32;
    assert_eq!(
        x.is_finite(),
        y.is_finite(),
        "f32 overflow during conversion"
    );
    y
}
fn main() {
    dbg!(f64_to_f32(42_f64));
    // dbg!(f64_to_f32(f64::MAX / 10.)); // panics
    dbg!(f64_to_f32(f64::NAN));
    dbg!(f64_to_f32(f64::INFINITY));
    dbg!(f64_to_f32(f64::NEG_INFINITY));
}
[src/main.rs:2] f64_to_f32(42_f64) = 42.0
[src/main.rs:4] f64_to_f32(f64::NAN) = NaN
[src/main.rs:5] f64_to_f32(f64::INFINITY) = inf
[src/main.rs:6] f64_to_f32(f64::NEG_INFINITY) = -inf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接