将整数添加到浮点时为什么会出错?

时间:2016-09-24 14:24:15

标签: floating-point rust integer operators

我开始学习Rust。我试过这个程序:

fn main() {
     let a = 5;
     let b = 5.5;
     let k = a + b;
     println!("{}", k);
}

并显示此错误:

error[E0277]: cannot add a float to an integer
 --> src/main.rs:4:16
  |
4 |      let k = a + b;
  |                ^ no implementation for `{integer} + {float}`
  |
  = help: the trait `std::ops::Add<{float}>` is not implemented for `{integer}`

代码错了吗?

1 个答案:

答案 0 :(得分:14)

技术上正确的答案是:因为没有人写过impl Add<f64> for i32 {}

厚颜无耻的答案是:因为Rust不希望你在脚下射击自己。

更长,可能更有用的答案是......

在计算机中,整数和浮点数都具有有限的范围,最终由我们用来表示它们的位数驱动。在Rust中,除非另有约束的整数的默认类型是i32,否则约束的浮点的默认类型是f64。< / p>

积分类型不允许您使用小数部分和浮点类型have a limited number of integers they can exactly represent。如果Rust允许你添加这两种类型,那么就可以决定哪个数据不太重要,这实际上并不是你想要系统编程语言做的事情!

以下是我可以看到的选项:

  1. 提出错误,迫使程序员选择他们需要的数据类型。
  2. 自动将两个数字转换为整数,丢弃任何潜在的小数值。
  3. 自动将两个数字转换为浮点数,不正确地表示较大的整数值。
  4. 在这些选择中,只有错误是合理的。

    还有可能引入一种能够精确处理任意精度的类型。不幸的是,这些类型不再是廉价的&#34;为了使处理器能够运行,所以你必须权衡性能。

    如果程序员希望执行某些转换,那么您可以使用as转换值:

    a as f64 + b;
    
    a + b as i32 
    

    Veedrac adds

      

    [这个答案给出] 0u32 + 0u64应该起作用的印象,但Rust没有做任何数字促销,即使促销无损。此外,i32f64是无损促销,因为f64有一个52位的尾数。

    虽然这些类型的扩展促销确实是无损的,但它们会隐含地增加您的内存需求。例如,过去只需要32位的内容现在需要64位。除了内存要求之外,还有语义考虑因素。如果值 只需要u8(0-255),那么将其增加一个可能超出该范围的值是没有意义的。知道进行这种转变是恰当的,完全取决于程序员。