我开始学习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}`
代码错了吗?
答案 0 :(得分:14)
技术上正确的答案是:因为没有人写过impl Add<f64> for i32 {}
。
厚颜无耻的答案是:因为Rust不希望你在脚下射击自己。
更长,可能更有用的答案是......
在计算机中,整数和浮点数都具有有限的范围,最终由我们用来表示它们的位数驱动。在Rust中,除非另有约束的整数的默认类型是i32
,否则约束的浮点的默认类型是f64
。< / p>
积分类型不允许您使用小数部分和浮点类型have a limited number of integers they can exactly represent。如果Rust允许你添加这两种类型,那么就可以决定哪个数据不太重要,这实际上并不是你想要系统编程语言做的事情!
以下是我可以看到的选项:
在这些选择中,只有错误是合理的。
还有可能引入一种能够精确处理任意精度的类型。不幸的是,这些类型不再是廉价的&#34;为了使处理器能够运行,所以你必须权衡性能。
如果程序员希望执行某些转换,那么您可以使用as
转换值:
a as f64 + b;
a + b as i32
[这个答案给出]
0u32 + 0u64
应该起作用的印象,但Rust没有做任何数字促销,即使促销无损。此外,i32
→f64
是无损促销,因为f64
有一个52位的尾数。
虽然这些类型的扩展促销确实是无损的,但它们会隐含地增加您的内存需求。例如,过去只需要32位的内容现在需要64位。除了内存要求之外,还有语义考虑因素。如果值 只需要u8
(0-255),那么将其增加一个可能超出该范围的值是没有意义的。知道进行这种转变是恰当的,完全取决于程序员。