我有一个ArrayList,我正在输入数字
23466012.83
23466413.39
23466411.94
等。
但是当我对它们进行重新排序后,我会像这样重新打印它们
2.346601283E7
2.346641339E7
2.346641194E7
为什么java会这样做以及如何解决这个问题? (我希望格式与输入时的格式相同)
谢谢!
答案 0 :(得分:2)
请查看Java如何处理primitive types及其相关对象。通过添加" double" (小写)原始类型转换为List,它们被转换为" Double"对象,因为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进行验证,当你需要它作为算术输入时,但总是使用原始输出。