代码之家  ›  专栏  ›  技术社区  ›  Olivier Lasne

将i128转换为f64的正确方法是什么

  •  0
  • Olivier Lasne  · 技术社区  · 1 年前

    我想 转换 一 i128 到a f64 .

    我知道我可以默默地投 as .

    let nb: i128 = 1337;
    let converted = nb as f64;
    

    但这并没有给我处理任何错误的机会。

    有没有办法做类似的事情

    let nb: i128 = 1337;
    let converted: f64 = nb.try_into()?;
    

    如果转换后的值不适合f64,我可以在哪里处理错误?

    1 回复  |  直到 1 年前
        1
  •  1
  •   prog-fh    1 年前

    没有标准 f64::try_from(i128) .
    您可以在互惠后通过检查来实现自己的功能 as 胁迫。

    fn try_to_f64(v: i128) -> Result<f64, &'static str> {
        let attempt = v as f64;
        (attempt as i128 == v)
            .then_some(attempt)
            .ok_or("precision loss in i128 to f64 conversion")
    }
    
    fn main() {
        for v in [
            123_456_789,
            123_456_789_123,
            123_456_789_123_456,
            123_456_789_123_456_789,
        ] {
            println!("{} ~~> {:?}", v, try_to_f64(v));
        }
    }
    /*
    123456789 ~~> Ok(123456789.0)
    123456789123 ~~> Ok(123456789123.0)
    123456789123456 ~~> Ok(123456789123456.0)
    123456789123456789 ~~> Err("precision loss in i128 to f64 conversion")
    */