Java 更改 ArrayList <Double>中双精度的格式



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

23466012.83
23466413.39
23466411.94

等等。

但是当我在排序后从数组中重新打印它们时,它们会像一样重新打印

2.346601283E7
2.346641339E7
2.346641194E7

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

谢谢!

请查看Java如何处理基元类型及其相关对象。通过将"double"(小写(基元类型添加到List中,它们被转换为"double"对象,因为Java中的List只能容纳对象,而不能容纳基元。

因此,当您稍后输出Double对象时,它实际上使用Double类的简单toString((方法来格式化行。这是通过以可读格式打印Double的整个范围来实现的,这就是为什么它选择了所谓的带指数显示的科学符号。

通过使用更有用的格式化程序,例如注释中提到的formatter类或MessageFormat类,您可以更好地控制输出的外观。

为什么java要做这个

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

如何解决这个问题?

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

我希望格式与输入时相同

首先,您需要明白,您不能获得"与输入时相同的格式",因为这些信息已无可挽回地丢失。不能通过检查Double值来确定使用了多少有效数字来解析它

如果你只需要用两个小数点进行打印,那么实现这一点的一种方法是:

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

如果您不一定要使用Double作为数值的容器,您也可以考虑使用BigDecimal,它可以精确地用十进制表示任意值。它需要更多的内存,计算速度也慢了很多,但对于许多用例来说,这两者都不重要。一个更大的问题是,BigDecimal的划分是一个相关的过程,因为默认情况下,API将坚持产生精确的结果,而对于像1/3这样简单的事情,这将失败。

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

其中value是要打印以系统显示屏幕的double基元变量。如果要继续在同一行打印,请移除%n

如果您希望数字以两位小数输出,无论它们是如何输入的,现有的答案都指示如何格式化输出。

如果你的意思是"我希望格式与输入时相同",那么只有一个实用的选项——存储输入字符串。您可以将其解析为double或BigDecimal进行验证,也可以在需要将其作为算术输入时进行验证,但始终使用原始值进行输出。

最新更新