Rei*_*iks 10 floating-point casting type-conversion rust
如何将 a 转换f64为最接近的f32?
既没有实现From也没有TryFrom实现,大概是因为此类实现仅提供用于无损转换。f32我还在文档中搜索了参考文献f64,反之亦然,但一无所获。
    let double: f64 = 0.;
    // doesn't work
    // let single: f32 = double.into();
    // let single: f32 = double.try_into().unwrap();
Run Code Online (Sandbox Code Playgroud)
    Rei*_*iks 16
在这种情况下,我们可以使用as关键字进行强制转换。通常不需要进行整数转换,因为“从较大的整数转换为较小的整数(例如 u32 -> u8)会截断”,而这通常是不需要的。然而,对于f64to来说,这是非常明智的:f32
从 f64 转换为 f32 将产生最接近的 f32
- 如有必要,根据 roundTiesToEven 模式进行舍入
 - 溢出时,产生无穷大(与输入符号相同)
 
    let double: f64 = 42.;
    dbg!(double as f32);
Run Code Online (Sandbox Code Playgroud)
[src/main.rs:13] double as f32 = 42.0
Run Code Online (Sandbox Code Playgroud)
如果不希望溢出到无穷大并且您想恐慌,最简单的解决方案可能是检查is_finite:
[src/main.rs:13] double as f32 = 42.0
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
[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
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           5634 次  |  
        
|   最近记录:  |