Java在ArrayList <double> </double>中更改double的格式

时间:2014-08-03 19:03:44

标签: java arraylist double decimalformat

我有一个ArrayList,我正在输入数字

23466012.83
23466413.39
23466411.94

等。

但是当我对它们进行重新排序后,我会像这样重新打印它们

2.346601283E7
2.346641339E7
2.346641194E7

为什么java会这样做以及如何解决这个问题? (我希望格式与输入时的格式相同)

谢谢!

4 个答案:

答案 0 :(得分:2)

请查看Java如何处理primitive types及其相关对象。通过添加&#34; double&#34; (小写)原始类型转换为List,它们被转换为&#34; Double&#34;对象,因为Java中的List只能保存对象,而不能保存基元。

因此,当您稍后输出Double对象时,它实际上使用Double类的简单toString()方法来格式化该行。这是以一种可读格式打印全系列Double的方式实现的,这就是为什么它选择带有指数显示的所谓Scientific Notation

使用更有用的格式化程序,例如评论或Formatter class中提到的MessageFormat class,您可以更好地控制输出的外观。

答案 1 :(得分:2)

  

为什么java会这样做

Java只使用默认数字格式打印出Double值。

  

如何解决?

明确指定所需的数字格式。

  

我希望格式与输入时的格式相同

首先,您需要了解您无法获得“与输入时相同的格式”,因为该信息无法挽回地丢失。无法通过检查Double值来确定使用了多少有效数字来解析它。

如果您只需要打印两个小数位,那么实现它的一种方法是使用以下语句:

System.out.format("%.2f%n", 23466012.83);

如果您有任何机会不必使用Double作为数值的容器,您也可以考虑BigDecimal,它可以精确地表示十进制表示法中的任意值。它需要更多的内存并且计算速度很多,但对于许多用例而言,这些都不是很重要。更大的问题是BigDecimal的划分是一个涉及的过程,因为默认情况下,API会坚持产生一个精确的结果,这对于1/3这样简单的事情都会失败。

答案 2 :(得分:1)

System.out.format("%f%n", value);

value是要在屏幕上打印到sysout的double原始变量。 如果要继续在同一行上打印,请删除%n

答案 3 :(得分:0)

如果您希望数字输出带有两个小数位,无论输入方式如何,都有现有答案表明如何格式化输出。

如果你的意思是“我希望格式与输入时相同”只有一个实用选项 - 存储输入字符串。你可以将它解析为double或BigDecimal进行验证,当你需要它作为算术输入时,但总是使用原始输出。