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

Dart中如何对两个List<double>按保留两位小数后比较?

在Dart中对List元素保留两位小数后比较的最优实现

要实现两个列表元素保留两位小数后相等的比较,推荐使用自定义相等性规则配合ListEquality的方式,无需额外生成新列表,兼顾性能与可读性。

实现代码

首先在pubspec.yaml中添加collection包依赖:

dependencies:
  collection: ^1.18.0

核心逻辑实现:

import 'package:collection/collection.dart';

void main() {
  var list1 = [3425,5559394484, 2351,4392210480, -2384,4831199322];
  var list2 = [3425,5559394472, 2351,4392210480, -2384,4831199122];

  // 自定义两位小数精度的相等性检查
  final twoDecimalEq = Equality<double>((a, b) {
    // 方案1:四舍五入到两位小数后比较(适合严格匹配格式化结果)
    return (a * 100).round() == (b * 100).round();
    
    // 方案2:差值绝对值小于0.005(等价于四舍五入后相等,避免浮点误差)
    // return (a - b).abs() < 0.005;
  });

  final listEq = ListEquality(twoDecimalEq);
  print(listEq.equals(list1, list2)); // 输出 true
}

方案说明

  • 方案1:通过(num * 100).round()将数值四舍五入到两位小数对应的整数,直接比较整数结果,逻辑直观,适合需要严格匹配"保留两位小数后数值"的场景。
  • 方案2:比较两个数的差值绝对值是否小于0.005,本质和四舍五入到两位小数等价,但能避免浮点运算带来的精度误差,更适合处理浮点型数值。

备选方案(不推荐大列表)

如果需要先生成保留两位小数的新列表再比较,可使用map转换,但会额外占用内存,大列表场景下性能不如上述方案:

List<double> roundToTwoDecimals(List<num> list) {
  return list.map((num) => (num * 100).round() / 100).cast<double>().toList();
}

void main() {
  var list1 = [3425,5559394484, 2351,4392210480, -2384,4831199322];
  var list2 = [3425,5559394472, 2351,4392210480, -2384,4831199122];

  print(ListEquality().equals(roundToTwoDecimals(list1), roundToTwoDecimals(list2)));
}

内容的提问来源于stack exchange,提问作者Андрей Ковынёв

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:22:48