将长双精度数字转换为不使用科学计数法的字符串 (Dart)

7
我想在Dart中将长双精度浮点数转换为字符串,但不使用科学计数法。我认为只需要使用.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,您是否也希望将其作为输出显示? - chux - Reinstate Monica
可以使用decimal package来实现相同的功能。 - dev-aentgs
2个回答

8

用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实现格式化? - dev-aentgs
1
很可能是的。intl包中的NumberFormat似乎对于分数正在做大致相同的事情 - 将分数转换为字符串,然后操作该字符串。 - lrn
先生,使用decimal package也可以以相同的方式完成。 - dev-aentgs
1
True。您需要通过指数符号进行转换,例如 Decimal.parse(myDouble.toString()),但是这样应该可以正常工作。 - lrn

5

可以使用decimal包来更简单地实现这一点。最近发现了一个指向该包的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接