2016-12-31 5 views
0

Я переписываю старую программу на Java 6, написанную для выполнения некоторых научных вычислений на Java 8, и застрял в этой ситуации, когда у меня возникают разные результаты для операции округления.Различные результаты округления в Java 6 и Java 8

Java 6 округляет вход как 0.499999999999999999994 до 1, но Java 8 делает это 0. Я не могу понять проблему здесь.

Например:

private void foo() { 
    System.out.println(Math.round(0.499999999999999999994)); 
} 

Приведенный выше код ведет себя по-разному для разных версий Java.

Было бы здорово, если бы кто-то мог пролить свет на эту проблему.

+0

отправить свой java 6 и java 8 код – Aaron

+0

@Aaron Я включил базовый код. Спасибо за ваш комментарий. –

ответ

2

Я думаю, вы наткнулись на известную ошибку в Java 6, которая позже была исправлена ​​на Java 7. Это объясняет странное поведение кода в Java 6 и Java 8.

Bug Информация:

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6430675

Больше информации и красивое объяснение по @OliverCharlesworth можно найти в этом посте:

Why does Math.round(0.49999999999999994) return 1

Отрывок из его пост:

В Java 6 (и предположительно ранее) круглый (x) реализован как этаж (x + 0,5). Это ошибка спецификации, для именно этого патологического случая. Java 7 больше не выполняет эту преломленную реализацию .

+0

Спасибо. Есть ли какое-либо исправление для этого? –

+0

Закрытие, как повторяющийся вопрос, может быть, более подходит тогда – weston

+2

Что вы можете сказать о @ShivamNegi? Теперь он исправлен, так что вы имеете в виду разбить его снова в java 8 или применить исправление назад к java 6? – weston

1

Причина, по которой выход вашего примера равен 0, отличается. 0.999999999999999999994 - double. Отбрасывая двойное значение, он уменьшает десятичные значе- ния двойного значения.

public class Example { 
    public static void main(String[] args) { 
     double d1 = 0.9; 
     Double D1 = Double.valueOf(d1); 
     int d1AsInt = (int)d1; 
     System.out.println("d1 as int:\t" + d1AsInt); 
     System.out.println("d1 as int:\t" + D1.intValue()); 
    } 
} 

Если опираться на точные значения, которые вы должны использовать BigDecimal и BigInteger.

+0

Прошу прощения за путаницу кода. Я вижу это поведение с 'Math.round()' –