Dart-双重数据类型加法会导致长十进制值

时间:2019-03-01 01:32:47

标签: dart flutter dart-2

在以下程序中,我添加了双打列表。

我期望的输出为57.7,但结果为57.699999999999996

void main() {
  List<double> list= [1.0,1.0,1.0,1.0,0.8,52.9];
  double total = 0.0;

  list.forEach((item) {
    total = total + item;
  });
  print(total);

}

这是预期的行为吗?

4 个答案:

答案 0 :(得分:2)

是的,这是预期的行为-要获得期望的结果,请使用-.toStringAsFixed(1)

void main() {
  List<double> list = [1.0, 1.0, 1.0, 1.0, 0.8, 52.9];
  double total = 0.0;

  list.forEach((item) {
    total = total + item;
  });
  print(total.toStringAsFixed(1));
}
  

输出:57.7

答案 1 :(得分:1)

使用reduce可以解决问题

var total = [1.1, 2.2, 3.3].reduce((a, b) => a + b); // 6.6

答案 2 :(得分:0)

这是由于浮点数学。此行为在许多语言中都很常见。如果您想进一步了解这一点,建议您使用site。诸如Java之类的某些语言已经使类可用于这种类型的精确操作,但是Dart对此没有官方支持,幸运的是,为了解决这个问题,有一个软件包。我会在这里告诉您什么对我有用。使用您的代码将如下所示:

首先要解决主要问题,我们必须使用一个名为“十进制”的程序包,在pubspec.yaml中添加以下依赖项并更新程序包:

name: ...
dependencies:
  decimal: ^0.3.5
  ...

然后您的文件将如下所示:

import 'package:decimal/decimal.dart';

void main() {
 List<double> list = [1.0, 1.0, 1.0, 1.0, 0.8, 52.9];
 
 double total = list.fold(0, (total, value) {
  var result = Decimal.parse(total.toString()) + Decimal.parse(value.toString());
  return double.parse(result.toString());
 });

 print(total); // 57.7
}

糟糕:我使用了Google翻译器。

答案 3 :(得分:0)

对于四舍五入的双类型加法



list.map<double>((m) => double.parse(m.totalTax.toDouble().toString())).reduce((a, b) => a + b).round()