Java 从字符串转换为双精度将删除尾随的零

Java 从字符串转换为双精度将删除尾随的零,java,double,number-formatting,Java,Double,Number Formatting,我正在尝试将双精度列表从字符串格式转换为双精度格式。为此,我将它们放入一个列表中,并使用Double.parseDouble(string)方法 这适用于大多数数字,但如果double包含尾随零,parseDouble方法将其删除,则会产生不需要的输出。我不想把它拿走 String[] values = {"124.50", "45.801", "-15.210"}; List<Double> nums = new ArrayList<Double>(); for(St

我正在尝试将双精度列表从字符串格式转换为双精度格式。为此,我将它们放入一个列表中,并使用
Double.parseDouble(string)
方法

这适用于大多数数字,但如果double包含尾随零,
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 + " ");
}
但是我想要后面的零。使用格式化行的问题是,在打印值时,我必须指定所需的浮点精度,但我不想让数字精确到某一点,只要保留零就行了

我的做法是否错误?

尝试使用:

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

打印数字时

如果您总是想要
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)] + " ");
}
final String[]值={“124.50”、“45.801”、“-15.210”};
最终列表nums=newarraylist();
最终列表bkpNums=newarraylist();
for(最终字符串s:值){
double d=double.parseDouble(s);
增加(d)项;
增加(d);
}
集合。排序(nums);
用于(双d:nums){
系统输出打印(值[bkpNums.indexOf(d)]+“”);
}

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

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);
    }
}

您可以使用
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 + " ");
}
String[]值={“124.50”、“45.801”、“15.210”};
List nums=new ArrayList();
用于(字符串s:值)
添加(新的BigDecimal);
集合。排序(nums);
for(BigDecimal:nums){
系统输出打印(d+“”);
}

当谈到实际的双精度值时,没有“尾随零”这样的东西。该死,@BrianRoach比我先说出来。你的问题有解决方案,但它们不是直接的@leigero。如果您希望输出总是有
n
十进制数字,您可以使用
DoubleFormat
@leigero-清楚地说,这与询问如何用整数(例如01)保留“前导零”是一样的。。。你把一个数字的文本表示和实际的二进制值混为一谈了感谢@BrianRoach我不得不从一个完全不同的角度来处理这个任务。你说的很有道理。完整的答案需要一些时间,但要点是创建一个包装类,它包含一个
double
值和尾随零的数量。也就是说。。。根据原始字符串,您可能仍然会遇到精度问题。不过,根据您所做的工作,仅保留对原始字符串的引用可能适合您的需要。(编辑:哈,你看,有人贴出来了)这不符合OPs描述:我不想让数字精确到某一点,只要保留零就行了。@Keppil第二个(完整的)解决方案实际上是从作为“输入”的
values
数组中打印值完全符合要求。不确定是谁对我的解决方案投了赞成票,但我当然希望他们在投票否决之前彻底阅读我的解决方案(如果您的数组对许多其他类可见,并且您不希望它们依赖于MyDouble,那么可以将MyDouble设置为
java.lang.Number
的子类,并指定一个
Number
数组。
-15.210 45.801 124.50
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 + " ");
}