【问题标题】:Convert long double to string without scientific notation (Dart)将 long double 转换为没有科学记数法的字符串 (Dart)
【发布时间】:2020-11-09 08:46:02
【问题描述】:

我想在 Dart 中将 long double 转换为没有科学记数法的字符串,我认为只需执行 .toString() 就可以解决问题,但事实并非如此。

这是我的代码:

void main() {  
  double num = 0.00000000196620214137477;
  String numToString = num.toString();
  
  print(num);
  print(numToString);
}

这是打印出来的:

1.96620214137477e-9
1.96620214137477e-9

我想要一个数字的字符串表示形式,因为它是在定义时写入的。所以转换为字符串后我想要的打印输出是:

0.00000000196620214137477

提前致谢。

【问题讨论】:

  • 如果数字的字符串表示为0.00000196620214137477e-3,您是否也希望将其视为输出?
  • 还有另一种方法可以使用decimal package

标签: string dart double


【解决方案1】:

没有简单的方法可以直接使用 Dart 平台库来做你想做的事,主要是因为 JavaScript 没有办法做到这一点。

您可以使用num.toStringAsFixed(20),但仅限于 20 位,并且您的号码需要 23。

您可以做的一件事是直接操作字符串:

String toExact(double value) {
  var sign = "";
  if (value < 0) {
    value = -value; 
    sign = "-";
  }
  var string = value.toString();
  var e = string.lastIndexOf('e');
  if (e < 0) return "$sign$string";
  assert(string.indexOf('.') == 1);
  var offset = int.parse(string.substring(e + (string.startsWith('-', e + 1) ? 1 : 2)));
  var digits = string.substring(0, 1) + string.substring(2, e);
  if (offset < 0) { 
    return "${sign}0.${"0" * ~offset}$digits";
  }
  if (offset > 0) {
    if (offset >= digits.length) return sign + digits.padRight(offset + 1, "0");
    return "$sign${digits.substring(0, offset + 1)}"
        ".${digits.substring(offset + 1)}";
  }
  return digits;
}

请注意,您不一定能得到所写的值,因为并非所有双精度值都是准确的。在这种特殊情况下,您似乎很好。

【讨论】:

  • 先生可以使用NumberFormat实现格式化吗?
  • 可能,是的。 intl 包的 NumberFormat 似乎对分数做大致相同的事情 - 将分数转换为字符串,然后操作字符串。
  • 先生,还有另一种方法可以使用decimal package
  • 是的。你必须通过指数符号,如Decimal.parse(myDouble.toString()),但它应该可以工作。
【解决方案2】:

还有另一种更简单的方法可以使用decimal package。最近遇到flutter-dart-number-handling-ability 指向包裹的问题。

例子:

double originalNum = 0.00000000196620214137477;
Decimal convertedNum = Decimal.parse(originalNum.toString());
print('originalNum: $originalNum \n convertedNum: $convertedNum');

输出:

originalNum: 1.96620214137477e-9 
convertedNum: 0.00000000196620214137477

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 2017-12-24
    相关资源
    最近更新 更多