2017-02-07 2 views
0
class test{ 
public static void main(String... args){ 
    double d=5.637; 
    System.out.println("double is:"+d); 
    long a=(long)d; 
    System.out.println("long is:"+a); 
    } 
} 

Выходной код вышеуказанного кода long is : 5, который как и ожидалось.ТипСпецификация от двойного к длинному в JAVA

Но когда я побежал следующий код:

class test{ 
public static void main(String... args){ 
    double d=123456789.637; 
    System.out.println("double is:"+d); 
    long a=(long)d; 
    System.out.println("long is:"+a); 
    } 
} 

Выход, как ожидалось. результат long is:9223372036854775807

Я хочу спросить, почему это происходит, когда я беру огромное количество в двойном размере.

+0

длинной формы этого двойных пересекают максимальное допустимое значение в течение длительного времени. –

+0

Когда значение 'double' превышает максимальное значение' long', результат [Сужение примитивного преобразования (JLS §5.1.3)] (https://docs.oracle.com/javase/specs/jls/se8 /html/jls-5.html#jls-5.1.3) от 'double' до' long' '' Long.MAX_VALUE', то есть '9223372036854775807': * [Когда] число с плавающей запятой преобразуется в' long' , [... и] значение [слишком] (положительное значение большой величины или положительная бесконечность), а результат [...] является наибольшим представимым значением типа 'long'. * – Andreas

ответ

1

для безопасного литья вы должны использовать Math.round(d) и не более длинного размер 9.223.372.036.854.775.807 вы пытаетесь Ассинг больше двойного значения для длительного

редактирования: вы можете использовать BigInteger вместо Long