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

为什么Dart执行简单double计算会出现结果误差,该如何避免?

问题产生原因

该现象不是Dart语言的bug,是所有遵循IEEE 754双精度浮点数标准的编程语言的共性特征:
计算机底层以二进制存储数值,绝大多数十进制小数(比如你代码里用到的0.1、0.3)无法用有限长度的二进制数精确表示,存储时会被截断为固定长度的近似值,本身就存在精度损失,加减运算后误差进一步累积,最终就会出现0.19999999999999998这类和预期不符的输出结果。
不管是Dart虚拟机运行环境还是Dartpad的JavaScript编译后端,默认都用IEEE 754双精度浮点数存储小数,因此都会复现该问题。

规避方法

你可以根据自己的业务精度要求,选择对应的解决方案:

  • 普通展示场景(对精度要求较低):输出时对结果做固定精度截断即可,可调用toStringAsFixed方法指定保留的小数位数:
void main() {
  double result = -0.1 + 0.3;
  // 保留1位小数后输出
  print(result.toStringAsFixed(1)); // 输出 0.2
}
  • 高精度要求场景(比如金融、计量相关业务):不要直接用double类型做运算,改用高精度十进制运算库处理数值,这类库以十进制规则存储和计算数值,完全规避二进制浮点数的精度误差,用法示例如下:
import 'package:decimal/decimal.dart';

void main() {
  final result = Decimal.parse('-0.1') + Decimal.parse('0.3');
  print(result); // 输出 0.2
}
  • 整数转换方案:可以把所有小数按最小精度单位放大为整数后再做运算,比如金额计算时统一以「分」为单位用整数存储、运算,最终展示时再除以100转换为「元」,全程不涉及浮点数运算,从根源避免精度问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:45:06