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

Dart中TextFormField输入值除以100出现精度异常,求排查

问题分析与解决方案

这既不是代码逻辑错误,也不是bug,而是二进制浮点数的精度限制导致的正常现象。

原因说明

double类型的浮点数基于二进制存储,很多十进制小数(比如0.007)无法被二进制浮点数精确表示,只能存储一个近似值。当你用double.tryParse解析输入字符串后,得到的已经是这个近似值,再除以100时,微小的精度误差会被放大,最终输出出现类似0.00007000000000000001或0.00008999999999999999的结果。

解决办法

有两种常用处理方式:

1. 格式化输出,固定小数位数

如果只是满足显示需求,可以在输出时指定保留的小数位数,忽略多余的精度误差:

void _setPercent(String? text) {
  var percent = double.tryParse(text ?? '') ?? 0.0;
  print('percent $percent');
  percent = percent / 100;
  // 保留6位小数,可根据实际需求调整位数
  print('new percent ${percent.toStringAsFixed(6)}');
}

这样输出会被格式化为指定位数的字符串,不会显示多余的误差数字。

2. 使用精确的十进制运算库

如果需要精确的数值计算(比如金融场景),可以使用decimal包处理十进制数,避免二进制浮点数的精度问题:
首先在pubspec.yaml中添加依赖:

dependencies:
  decimal: ^2.3.3

然后修改代码:

import 'package:decimal/decimal.dart';

void _setPercent(String? text) {
  var input = text ?? '0';
  Decimal percent = Decimal.tryParse(input) ?? Decimal.zero;
  print('percent $percent');
  percent = percent / Decimal.fromInt(100);
  print('new percent $percent');
}

使用Decimal类型可以精确处理十进制的加减乘除,不会出现精度丢失的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:17:08