【问题标题】:Convert from string to double removes trailing zeros从字符串转换为双精度删除尾随零
【发布时间】:2014-02-02 04:01:13
【问题描述】:

我正在尝试将双精度列表从字符串格式转换为双精度格式。我通过将它们放入列表并使用Double.parseDouble(string) 方法来做到这一点。

这适用于大多数数字,但当双精度包含尾随零时,parseDouble 方法正在删除它,它会提供不需要的输出。我不想删除它。

String[] values = {"124.50", "45.801", "-15.210"};
List<Double> nums = new ArrayList<Double>();

for(String s: values)
nums.add(Double.parseDouble(s));
Collections.sort(nums);

for(Double d: nums){
    System.out.print(d + " ");
}

这会产生输出:

-15.21 45.801 124.5

但我想要尾随零。使用格式化行的问题是我必须在打印值时指定我想要的浮点精度,但我没有任何特别希望使数字准确到某个点,如果只留下零他们在那里。

我是不是搞错了?

【问题讨论】:

  • 在谈到实际的双精度值时,没有“尾随零”之类的东西。
  • 当,@BrianRoach 打败了我。您的问题有解决方案,但它们不是直截了当的@leigero。如果你希望输出总是有n十进制数字,你可以使用DoubleFormat
  • @leigero - 需要明确的是,这与询问如何使用整数(例如 01)保留“前导零”是一回事……您将数字的文本表示与实际二进制值
  • 谢谢@BrianRoach 我将不得不从一个完全不同的角度来处理这项任务。你说的很有道理。
  • 完整的答案需要一些时间,但它的要点涉及创建一个包含 double 值和尾随零数量的包装类。也就是说......根据原始字符串,您可能仍会遇到精度问题。不过,根据您的操作,仅保留对原始字符串的引用可能会满足您的需求。 (编辑:哈,你去吧,有人发布了)

标签: java double number-formatting


【解决方案1】:

您可以使用BigDecimal 来处理这些值。 BigDecimal 保留尾随零。

String[] values = {"124.50", "45.801", "-15.210"};
List<BigDecimal> nums = new ArrayList<BigDecimal>();

for(String s: values)
    nums.add(new BigDecimal(s));
Collections.sort(nums);

for(BigDecimal d: nums) {
    System.out.print(d + " ");
}

【讨论】:

    【解决方案2】:

    您可以存储对原始字符串的引用并打印它而不是解析的双精度

    public static void main(String[] args) {
        String[] values = {"124.50", "45.801", "-15.210"};
        List<MyDouble> nums = new ArrayList<MyDouble>();
    
        for(String s: values)
        nums.add(new MyDouble(s));
        Collections.sort(nums);
    
        for(MyDouble d: nums){
            System.out.print(d + " ");
        }
    }
    
    static class MyDouble implements Comparable<MyDouble> {
        final double val;
        final String string;
        MyDouble(String str) {
            string = str;
            val = Double.parseDouble(str);
        }
    
        @Override
        public String toString() {
            return string;
        }
    
        @Override
        public int compareTo(MyDouble o) {
            return (int) (val - o.val);
        }
    }
    

    结果:

    -15.210 45.801 124.50
    

    【讨论】:

    • 如果您的数组对许多其他类可见并且您不希望它们依赖于 MyDouble,您可以将 MyDouble 设为 java.lang.Number 的子类并指定 Number 数组。跨度>
    【解决方案3】:

    如果您总是想要n 十进制数字,您可以执行以下操作:

    final DecimalFormat df = new DecimalFormat("#.000");
    for (Double d : nums) {
        System.out.print(df.format(d) + " ");
    }
    

    更具体地说,此解决方案适用于您,但正如 @BrianRoach 在他的评论中提到的那样,在谈论实际的双数时,没有尾随零之类的东西。

    final String[] values = {"124.50", "45.801", "-15.210"};
    final List<Double> nums = new ArrayList<>();
    final List<Double> bkpNums = new ArrayList<>();
    
    for (final String s : values) {
        double d = Double.parseDouble(s);
        nums.add(d);
        bkpNums.add(d);
    }
    Collections.sort(nums);
    
    for (Double d : nums) {
        System.out.print(values[bkpNums.indexOf(d)] + " ");
    }
    

    【讨论】:

    • 这不符合 OP 的描述:我没有任何特别希望将数字精确到某个点,如果它们在那里,只需将零放在一边 .
    • @Keppil 第二个(完整的)解决方案实际上打印了 values 数组中的值,该数组是“输入”并且完全符合要求。不确定谁对我的解决方案投了反对票,但我当然希望他们在投反对票之前能完整阅读我的解决方案。 :(
    【解决方案4】:

    尝试使用:

    DecimalFormat df = new DecimalFormat("###.#");
    

    打印数字时

    【讨论】:

      猜你喜欢
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 2014-08-09
      • 2011-08-11
      相关资源
      最近更新 更多