【问题标题】:How to convert double into string with 2 significant digits?如何将double转换为具有2位有效数字的字符串?
【发布时间】:2023-04-02 09:12:01
【问题描述】:

所以我有小的双精度值,我需要将它们转换为字符串以便在我的应用程序中显示。但我只关心前两位有效数字。 它应该像这样工作:

convert(0.000000000003214324) = '0.0000000000032';
convert(0.000003415303) = '0.0000034';

【问题讨论】:

    标签: flutter dart double


    【解决方案1】:

    我们可以将 double 转换为字符串,然后检查每个索引并获取最多两个非零(也是 .)字符串。但问题在于long double 的科学记数法

    您可以查看Convert long double to string without scientific notation (Dart)

    在这种情况下,我们需要找到确切的字符串值。我正在向this answer.寻求帮助

    String convert(String number) {
      String result = '';
    
      int maxNonZeroDigit = 2;
    
      for (int i = 0; maxNonZeroDigit > 0 && i < number.length; i++) {
        result += (number[i]);
        if (number[i] != '0' && number[i] != '.') {
          maxNonZeroDigit -= 1;
        }
      }
    
      return result;
    }
    
    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;
    }
    
    
    void main() {
      final num1 = 0.000000000003214324;
      final num2 = 0.000003415303;
    
      final v1 = convert(toExact(num1));
    
      final v2 = convert(toExact(num2));
      print("num 1 $v1 num2 $v2");
    }
    
    

    dartPad上运行

    【讨论】:

    • 如果数字只有一位(0,00000000001),则会出错。所以你需要把var digits = string.substring(0, 1) + string.substring(2, e);替换成final digits = string.substring(0, e).replaceAll('.', '');
    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 2017-12-20
    • 1970-01-01
    • 2014-05-07
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    相关资源
    最近更新 更多