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

Dart浮点数运算精度异常解决:无需指定小数位数得正确结果

Dart浮点数精度问题解决方法(无需指定小数位数)

在Dart中执行浮点数乘除时,常会出现精度误差,比如整数762乘以0.11,结果会是83.82000000000001而非预期的83.82。这是因为二进制浮点数无法精确表示所有十进制小数,像0.11这类数值在二进制中是无限循环的近似值,运算后误差被放大。

以下是无需指定固定小数位数的解决办法:

方法一:使用decimal包处理精确十进制运算

decimal是Dart生态中专门用于精确十进制计算的库,能完美规避二进制浮点数的精度问题,且不需要提前指定小数位数。

步骤:

  1. 在项目的pubspec.yaml中添加依赖:
dependencies:
  decimal: ^2.3.3 # 可替换为最新版本
  1. 执行dart pub get安装依赖。
  2. 修改代码使用Decimal类型运算:
import 'package:decimal/decimal.dart';

void main() {
  int number = 762;
  print('number= $number');
  
  // 使用Decimal进行精确计算
  Decimal result = Decimal.fromInt(number) * Decimal.parse('0.11');
  print('number * 0.11 = $result'); // 输出:83.82
  
  // 如需转换为double类型(仅当结果能被二进制精确表示时推荐)
  double doubleResult = result.toDouble();
  print('转换为double:$doubleResult');
}

方法二:整数运算转译(适合已知小数位数的场景)

如果运算的小数位数固定(比如乘以0.11就是两位小数),可以先将所有数转为整数运算,再还原结果,避免浮点数误差:

void main() {
  int number = 762;
  print('number= $number');
  
  // 转成整数运算:762 * 11 = 8382,再处理为对应小数格式
  int integerResult = number * 11;
  String resultStr = '${integerResult ~/ 100}.${integerResult % 100}'
      .replaceAll(RegExp(r'0+$'), '')
      .replaceAll(RegExp(r'\.$'), '');
  print('number * 0.11 = $resultStr'); // 输出:83.82
}

不过这种方法仅适用于能明确转换为整数运算的场景,对于复杂的多小数位数混合运算,还是推荐使用decimal包。

注意事项

  • 涉及金额、高精度统计等场景,绝对不要依赖double类型的直接输出做精确计算,必须使用精确的十进制类型。
  • 使用decimal包时,所有参与精确计算的数值都要转为Decimal类型,避免混合运算再次引入误差。

内容的提问来源于stack exchange,提问作者Ηλίας Λάμπρου

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:52:44