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

Dart与Flutter中如何将科学计数法转换为普通数字

在Dart中将科学计数法数值转换为普通数字

下面提供两种实用方法,满足不同场景需求:

方法一:借助intl包的NumberFormat

如果可以引入第三方包,这是最简便的方式,通过指定足够多的小数位来强制输出普通数字格式:

首先在pubspec.yaml中添加依赖:

dependencies:
  intl: ^0.18.1

然后编写代码:

import 'package:intl/intl.dart';

void main() {
  double scientificNum = 9.565108299996563e-10;
  // 定义足够多的小数位,确保完整展示所有精度
  NumberFormat numFormatter = NumberFormat('0.00000000000000000000');
  String plainNumber = numFormatter.format(scientificNum);
  print(plainNumber); // 输出:0.0000000009565108299996563
}

方法二:手动解析字符串(无依赖)

如果不想引入第三方包,可以直接处理科学计数法格式的字符串,实现转换:

String convertScientificToPlain(String sciStr) {
  // 不是科学计数法直接返回
  if (!sciStr.contains('e')) return sciStr;

  // 拆分数字部分和指数部分
  List<String> parts = sciStr.split('e');
  String numSegment = parts[0];
  int exponent = int.parse(parts[1]);

  // 拆分整数和小数部分
  List<String> numParts = numSegment.split('.');
  String integerPart = numParts[0];
  String decimalPart = numParts.length > 1 ? numParts[1] : '';

  if (exponent >= 0) {
    // 正指数:小数点右移,补0
    decimalPart += '0' * exponent;
    String result = '$integerPart$decimalPart';
    // 移除开头多余的0(除了单个0的情况)
    return result.replaceFirst(RegExp(r'^0+(?=\d)'), '');
  } else {
    // 负指数:小数点左移,补前导0
    int shiftCount = -exponent;
    int zerosNeeded = shiftCount - integerPart.length;
    // 处理整数部分为0的情况
    if (integerPart == '0') {
      zerosNeeded = shiftCount - 1;
    }
    String leadingZeros = '0' * zerosNeeded;
    return '0.$leadingZeros${integerPart.replaceFirst('0', '')}$decimalPart';
  }
}

void main() {
  String sciNumber = '9.565108299996563e-10';
  print(convertScientificToPlain(sciNumber)); // 输出:0.0000000009565108299996563
}

注意:如果是直接处理double类型的数值,可能会存在浮点数精度丢失问题,若要保留原始字符串的完整精度,建议直接以字符串形式传入科学计数法内容进行转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:01:18