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

Java更改ArrayList中的双精度格式<;双倍>;,java,arraylist,double,decimalformat,Java,Arraylist,Double,Decimalformat,我有一个ArrayList,我正在将数字输入其中 23466012.83 23466413.39 23466411.94 等等 但是,当我从数组中重新打印它们时,在对它们进行排序之后,它们会像这样重新打印 2.346601283E7 2.346641339E7 2.346641194E7 为什么java会这样做?如何解决这个问题?(我希望格式与输入时相同) 谢谢 System.out.format("%f%n", value); 其中value是要在屏幕上打印的double基本变量。 如果

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

23466012.83
23466413.39
23466411.94
等等

但是,当我从数组中重新打印它们时,在对它们进行排序之后,它们会像这样重新打印

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

谢谢

System.out.format("%f%n", value);
其中
value
是要在屏幕上打印的
double
基本变量。 如果要继续在同一行上打印,请删除
%n

其中
value
是要在屏幕上打印的
double
基本变量。
如果要继续在同一行上打印,请删除
%n

请查看Java如何处理及其相关对象。通过将“double”(小写)原语类型添加到列表中,它们将转换为“double”对象,因为Java中的列表只能保存对象,而不能保存原语

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


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

请查看Java如何处理及其相关对象。通过将“double”(小写)原语类型添加到列表中,它们将转换为“double”对象,因为Java中的列表只能保存对象,而不能保存原语

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

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

为什么java会这样做

Java只是使用默认的数字格式打印出您的

如何解决这个问题

通过显式指定所需的数字格式

我希望格式与输入时相同

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

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

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

如果你不一定要使用<代码>双< /代码>作为数值的容器,你也可以考虑<代码> BigDecimal > /代码>,它可以精确地表示十进制记法中的任意值。它需要更多的内存,并且计算速度要慢很多,但是对于许多用例来说,这两者都不重要。一个更大的问题是,

BigDecimal
的划分是一个复杂的过程,因为在默认情况下,API将坚持生成精确的结果,而对于1/3这样简单的事情,这将失败

为什么java会这样做

Java只是使用默认的数字格式打印出您的

如何解决这个问题

通过显式指定所需的数字格式

我希望格式与输入时相同

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

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

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

如果你不一定要使用<代码>双< /代码>作为数值的容器,你也可以考虑<代码> BigDecimal > /代码>,它可以精确地表示十进制记法中的任意值。它需要更多的内存,并且计算速度要慢很多,但是对于许多用例来说,这两者都不重要。一个更大的问题是,

BigDecimal
的划分是一个复杂的过程,因为默认情况下,API会坚持生成精确的结果,这对于1/3这样简单的事情来说是失败的。

现有的答案表明,如果您希望数字以两位小数输出,如何格式化输出,不管它们是如何输入的


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

现有答案表明,如果您希望将数字输出为两位小数,无论它们是如何输入的,如何设置输出格式


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

您可以发布用于打印它们的代码吗?您还应该注意,当您将“23466012.83”作为double提供时,Java实际上正在解析您的字符串并将其与该值可用的最接近的double相关联。因此,当您打印双精度值时,您不一定要打印您解析的相同内容。双精度值没有格式。只有它们的字符串表示形式可以这样做,因此您需要对此进行更改,例如使用String.format或System.out.formt或printf…没有人会建议使用BigDecimal来确保提供的值是正确的