Math 如何乘/除/加/减不同类型的数字?

Math 如何乘/除/加/减不同类型的数字?,math,rust,arithmetic-expressions,Math,Rust,Arithmetic Expressions,我正在阅读生锈手册的第二版,并决定尝试制作经典的摄氏到华氏转换器: fn c_to_f(c: f32) -> f32 { return ( c * ( 9/5 ) ) + 32; } 使用货物构建编译此文件将产生编译时错误: error[E0277]:未满足特性绑定'f32:std::ops::Mul' -->src/main.rs:2:12 | 2 |返回(c*(9/5))+32; |^^^^^^^^^^^^^^^^^特性“std::ops::Mul”未为“f32”实现` |

我正在阅读生锈手册的第二版,并决定尝试制作经典的摄氏到华氏转换器:

fn c_to_f(c: f32) -> f32 {
    return ( c * ( 9/5 ) ) + 32;
}
使用
货物构建编译此文件将产生编译时错误:

error[E0277]:未满足特性绑定'f32:std::ops::Mul'
-->src/main.rs:2:12
|
2 |返回(c*(9/5))+32;
|^^^^^^^^^^^^^^^^^特性“std::ops::Mul”未为“f32”实现`
|
=注意:`f32*{integer}没有实现`
作为一个新的Rust程序员,我的解释是我不能将浮点和整数类型相乘。我通过将所有常量设为浮点来解决这个问题:

fn c_to_f(c: f32) -> f32 {
    return ( c * ( 9.0/5.0 ) ) + 32.0;
}

这使我有所保留。来自C/C++/Java/Python,令人惊讶的是,您不能简单地对不同类型的数字执行算术运算。像我在这里做的那样,简单地将它们转换为相同的类型是正确的吗?

TL;DR
as
是在原始数字类型之间转换的最常见方法,但使用它需要思考

fn c_to_f(c: f32) -> f32 {
    (c * (9 as f32 / 5 as f32)) + 32 as f32
}
但在本例中,更合理的做法是从以下内容开始使用浮点文字:

fn c_to_f(c: f32) -> f32 {
    (c * (9. / 5.)) + 32.
}

真正的问题是做混合型算术有点复杂

如果将a
T
乘以a
T
,通常希望得到类型为
T
,至少是基本类型的结果

但是,混合类型时,存在一些困难:

  • 混合信号
  • 混合精度
那么,例如,
i8*u32
的理想结果是什么?可以包含全部
i8
u32
值的最小类型是
i64
。这应该是结果吗

另一个例子是,
f32*i32
的理想结果是什么?可以包含所有
f32
i32
值的完整集合的最小类型是a
f64
。这应该是结果吗

我觉得拥有这样一个广阔的世界的想法相当令人困惑。它还对性能有影响(一旦矢量化,
f32
上的操作可能比
f64
上的操作快得多)

由于这些问题,Rust现在要求您明确:您希望将计算带入哪种类型?哪种类型适合您的特殊情况

然后使用
as
进行适当的强制转换,并考虑应用哪种舍入模式(
.round()
.ceil()
.floor()
.trunc()
从浮点转换为整数)


1以类似的方式加、减、除运算。

顺便说一句,
(c*(9/5))+32的可能重复,可以解释如何施放吗?“如果我想在将来乘/除/加/减不同类型的数字,解决方案是什么?”@Stargateur:这一点很好,对我来说似乎很明显,但最好说清楚,特别是从FP到整数的转换需要选择适当的舍入模式。具体的例子请,例如,如果我想将f64划分为u128,那么在不首先将u128强制转换为f64的情况下(因为它们会溢出),如何才能做到这一点?。