Java openjdk8中的舍入问题

Java openjdk8中的舍入问题,java,number-formatting,Java,Number Formatting,在open jdk1.8中使用NumberFormat.format(double)时,我看到了一些奇怪的问题。我知道以前的版本中有一个舍入问题,这个问题在这个版本中得到了修复,但仍然有问题 public static void main (String args[]) { double num = 16.34625; NumberFormat nf = NumberFormat.getInstance(); nf.setGroupingUsed(false);

open jdk1.8中使用
NumberFormat.format(double)
时,我看到了一些奇怪的问题。
我知道以前的版本中有一个舍入问题,这个问题在这个版本中得到了修复,但仍然有问题

public static void main (String args[]) {
    double num = 16.34625;

    NumberFormat nf = NumberFormat.getInstance();
    nf.setGroupingUsed(false);
    nf.setMinimumFractionDigits(2); 
    nf.setMaximumFractionDigits(4);

            System.out.println("nf : " + nf.getRoundingMode());
            System.out.println("BigDecimal is " + new  BigDecimal(num).toString());     

    System.out.println("num after number format : " + nf.format(num));
}
以下是显示的实际结果:

nf : HALF_EVEN
num : 16.34625
BigDecimal is 16.346250000000001278976924368180334568023681640625
num after number format : 16.3463
但是,我希望它被四舍五入到16.3462,因为在半偶数模式下,被丢弃数字左边的数字是偶数,所以它应该作为半偶数


下面是java文档来支持这一点()。

你说的一切都是对的。唯一的问题是,您的BigDecimal不是16.34625,而是16.346250000001278976924368180334568023681640625。因此邻域之间的距离不是相等的。

您可以尝试在
biginger
本身中进行取整。您可以使用该类的
setScale
方法

System.out.println(new BigDecimal(num).setScale(4,BigDecimal.ROUND_HALF_EVEN));
//16.3463

使用半偶数舍入,如果它与两个邻居的距离相等,则舍入到最近的偶数。但16.346250000001278976924368180334568023681640625比16.3462更接近16.3463。事实上,浮点数和double不能准确地表示十进制数。尝试从数字的字符串表示形式(即“16.34625”)创建BigDecimal以获得所需的行为带有
字符串num=“16.34625”看看会发生什么…抱歉,但我还是有点困惑。我同意,双16.34625的最接近表示为16.346250000001278976924368180334568023681640625。但是,由于小数点后的第5位是等距的“5”,因此,由于其前一位是偶数的“4”,它应该作为向下的半个数字,最终结果应该是16.3462。如果前面的数字是奇数,那么它应该充当上半个数字。这不对吗?我不想得到某个数字。我只是好奇为什么会有这种行为。