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,提问作者Андрей Ковынёв
相关产品推荐
相关产品推荐

