Rust 将usize转换为f32

Rust 将usize转换为f32,rust,Rust,我实现了以下计算序列平均值的函数: fn mean<T, R>(seq: &[T]) -> R where R: Div<R, Output=R> + From<T> + From<usize> + Sum<R> { let total: R = seq.iter().map(|&x| R::from(x)).sum() let size = R::from(seq.len()) t

我实现了以下计算序列平均值的函数:

fn mean<T, R>(seq: &[T]) -> R
    where R: Div<R, Output=R> + From<T> + From<usize> + Sum<R>
{
    let total: R = seq.iter().map(|&x| R::from(x)).sum()
    let size = R::from(seq.len())
    total / size
}
5 | fn均值(序列:&[T])->R
|    ----
6 |式中R:Div+From+From+Sum
|--------此界限要求的“平均值”`
...
15 | let结果:f32=平均值(和数字);
|^f32未实现特性“std::convert::From”`

由于我还是一个性格特征的初学者,所以我对此感到十分困惑。我如何解决这个具体问题?(如果可以)

不可能以
f32
格式表示所有可能的
i32
值。 这就是为什么为
f32
提供的
trait实现中的
仅支持
i16
/
u16
/
i8
/
u8


i32
f32
具有相同的字节数,但通常f32为指数花费的字节数很少,因此它不能表示
i32
中的所有数字

问题在于
f32
没有实现来自
。它确实实现了来自
、来自
、来自
和来自的
。这是因为
f32`不能精确表示较大整数的所有值

您可能希望将
用作
转换,这会导致精度损失。不幸的是,您不能在泛型类型上使用
as
,只能在基元类型上使用

您可以编写一个trait来手动执行所有必要的
转换。。。但当然,这是有原因的!使用
num\u traits::cast::asprimitive
您的代码将变成:

fn mean<T, R>(seq: &[T]) -> R
    where R: Div<R, Output=R> + Sum<R> + Copy + 'static,
          T: AsPrimitive<R>,
          usize: AsPrimitive<R>
{
    let total: R = seq.iter().map(|&x| x.as_()).sum();
    let size = seq.len().as_();
    total / size
}
fn平均值(序列:&[T])->R
其中R:Div+Sum+Copy+static,
T:基本的,
usize:AsPrimitive
{
设total:R=seq.iter().map(|&x|x.as|()).sum();
设大小=序号len().as_u2;;
总数/尺寸
}

我已经添加了
Copy
约束,我认为您在代码中遗漏了该约束,以及
R
静态约束,该约束是
asiprimitive

所必需的。请在回答问题之前搜索重复项并标记为重复项。请在回答问题之前搜索重复项并标记为重复项。
5  | fn mean<T, R>(seq: &[T]) -> R
   |    ----
6  |     where R: Div<R, Output=R> + From<T> + From<usize> + Sum<R>
   |                                           ----------- required by this bound in `mean`
...
15 |     let result: f32 = mean(&numbers);
   |                       ^^^^ the trait `std::convert::From<usize>` is not implemented for `f32`
fn mean<T, R>(seq: &[T]) -> R
    where R: Div<R, Output=R> + Sum<R> + Copy + 'static,
          T: AsPrimitive<R>,
          usize: AsPrimitive<R>
{
    let total: R = seq.iter().map(|&x| x.as_()).sum();
    let size = seq.len().as_();
    total / size
}