Вопрос округления в openjdk8 - PullRequest
1 голос
/ 15 октября 2019

Я вижу странную проблему при использовании NumberFormat.format(double) в open jdk1.8. Я знаю, что была проблема с округлением в предыдущих версиях, которая была исправлена ​​в этой версии, но все еще что-токажется выключенным

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, поскольку в режиме HALF_EVEN цифра слева от отброшенногочисло четное, поэтому оно должно действовать как HALF_DOWN.

Вот документ на Java, подтверждающий это (https://docs.oracle.com/javase/7/docs/api/java/math/RoundingMode.html#HALF_EVEN).

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Вы можете попробовать округлить в самом BigInteger. Вы можете использовать setScale метод этого класса.

System.out.println(new BigDecimal(num).setScale(4,BigDecimal.ROUND_HALF_EVEN));
//16.3463
0 голосов
/ 15 октября 2019

Вы правы во всем. Единственная проблема заключается в том, что ваш BigDecimal не 16,34625, а 16,346250000000001278976924368180334568023681640625. Так что соседи не равноудалены.

...