Сегодня я натолкнулся на своеобразное поведение Math.pow(). Я не могу понять, вывод следующего кода Java:Завершает ли Java Math.pow результат?
long N1 = 999999999999999999L;
System.out.println("N1 : " + N1);
long N2 = (long) Math.pow(N1, 1);
System.out.println("N2 : " + N2);
я получаю следующий результат:
N1 : 999999999999999999
N2 : 1000000000000000000
Я всегда думал, что Math.pow() производит точный результат до тех пор, переданные ему параметры являются целыми или длинными, если нет переполнения (что в данном случае верно).
Этот код является преобразование длинный для двойной и обратно ... что происходит, если вы делаете это преобразование без Math.pow() вообще? Разве это не делает то же самое? –
@MichaelAaronSafyan Вы правы! 'long N3 = (long) (double) N1;' –
'long' и' double' оба занимают 64 бита, и есть очень много значений 'double', которые не могут быть представлены точно с' long'. Поэтому должно быть очень много «длинных» значений, которые не могут быть представлены точно с помощью «double». Вы нашли один из них. –