You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中不含NAN/Inf的Vec<f64>如何获取最值,解决Ord trait未实现报错

问题描述

我尝试获取Vec<f64>的最小值和最大值,由于f64类型存在NAN和无穷大值,未实现Ord trait,编译时会抛出如下错误:

the trait `Ord` is not implemented for `f64`

若可确保Vec中永远不会包含NAN、Inf值,请问有什么方法可以正常获取该容器的最值?

解决方案

以下两种方案均基于标准库实现,无需引入第三方依赖:

  • 方案1:结合f64原生最值方法 + 迭代器fold计算
    f64类型本身内置了max、min方法用于两个浮点数的比较,搭配迭代器的fold方法遍历整个集合即可得到全局最值。
    示例代码:
fn main() {
    let num_list = vec![1.2, 3.4, 0.8, 5.6, 2.1];
    // 计算最大值
    let max_val = num_list.iter().fold(f64::MIN, |current_max, num| current_max.max(*num));
    // 计算最小值
    let min_val = num_list.iter().fold(f64::MAX, |current_min, num| current_min.min(*num));
    println!("最大值:{},最小值:{}", max_val, min_val);
}

注意:该方案在容器为空、或存在非预期的NAN值时,会返回NAN结果,无显式报错。

  • 方案2:使用partial_cmp显式断言排序
    如果你需要对「无NAN/Inf」的约束做显式校验,避免异常值导致的静默错误,可以用max_by/min_by结合partial_cmp实现,遇到NAN时会直接panic提示问题。
    示例代码:
use std::cmp::Ordering;

fn main() {
    let num_list = vec![1.2, 3.4, 0.8, 5.6, 2.1];
    let max_val = num_list.iter().max_by(|a, b| a.partial_cmp(b).unwrap()).unwrap();
    let min_val = num_list.iter().min_by(|a, b| a.partial_cmp(b).unwrap()).unwrap();
    println!("最大值:{},最小值:{}", max_val, min_val);
}

注意:第二个unwrap用于处理空容器的情况,如果你的Vec可能为空,需要自行添加空值判断逻辑。

内容的提问来源于stack exchange,提问作者til

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 07:09:02