Java 小数格式未按半舍五入给出结果

Java 小数格式未按半舍五入给出结果,java,decimalformat,Java,Decimalformat,我正设法四舍五入到小数点后1位。下面是代码片段 DecimalFormat decimalFormat = new DecimalFormat("#0.#"); String formattedNumber = decimalFormat.format(4.65d); System.out.println(formattedNumber); 输出4.7 根据DecimalFormat javadoc,其默认舍入为半偶数。根据这条规则,4.65应该四舍五入到4.6。但是,它的输出为4.7。请帮助

我正设法四舍五入到小数点后1位。下面是代码片段

DecimalFormat decimalFormat = new DecimalFormat("#0.#");
String formattedNumber = decimalFormat.format(4.65d);
System.out.println(formattedNumber);
输出
4.7


根据DecimalFormat javadoc,其默认舍入为半偶数。根据这条规则,4.65应该四舍五入到4.6。但是,它的输出为4.7。请帮助我理解这种行为。

对于许多十进制值,double有一个小的表示错误,其中包括4.65,它实际上略高于它的显示值

System.out.println(new BigDecimal(4.65));
印刷品

4.6500000000000003552713678800500929355621337890625

double对于许多十进制值都有一个小的表示错误,其中包括4.65,这实际上略高于它显示的值

System.out.println(new BigDecimal(4.65));
印刷品

4.6500000000000003552713678800500929355621337890625

除了Peter的Lawrey答案之外,您还可以尝试传递到
decimalFormat.format()
method
BigDecimal(String val)
以确保传递准确的值:

String formattedNumber = decimalFormat.format(new BigDecimal("4.65"));
System.out.println(formattedNumber);

您将获得
4.6

的输出,除了Peter的Lawrey答案,您可以尝试传递到
decimalFormat.format()
方法
BigDecimal(String val)
,以确保传递准确的值:

String formattedNumber = decimalFormat.format(new BigDecimal("4.65"));
System.out.println(formattedNumber);

您将获得
4.6

@ChiragParmar的输出。这不是重复的。另一个问题是关于理解半个偶数的基础,这不是这个问题的目的。更确切地说,我们正在讨论在上述情况下,在roundin时出现意外行为的原因,您提供的另一个问题没有回答。@ChiragParmar这不是重复的。另一个问题是关于理解半个偶数的基础,这不是这个问题的目的。更确切地说,我们正在讨论在上述案例中出现意外行为的原因,您提供的另一个问题没有回答。谢谢您的回答。您能否提供一些阅读材料,以了解有关此错误在某些十进制值中表示的更多信息。它是Java特有的吗?@sky对于所有IEEE 754标准实现来说都是相同的问题。谷歌搜索关于这个的链接。一半的偶数并不意味着什么,除非它的值作为一个精确的表示。谢谢你的回答。您能否提供一些阅读材料,以了解有关此错误在某些十进制值中表示的更多信息。它是Java特有的吗?@sky对于所有IEEE 754标准实现来说都是相同的问题。谷歌搜索关于这个的链接。即使一半也没有多大意义,除非该值作为精确的表示。