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