2013-05-15 12 views
6

non riesco a capire perché questoRiguardo tipo float precisione

float f = Integer.MAX_VALUE; 
System.out.println(Integer.MAX_VALUE); 
System.out.println((int)f); 

produce le stesse linee,

Come pure perché questo fa

Float f2 = (float) Integer.MAX_VALUE; 
System.out.println(Integer.MAX_VALUE); 
System.out.println(f2.intValue()); 

intendo, lunghezza mantissa per il galleggiamento il numero del punto è 2^23-1. Come fa a mantenere max_value di numero intero, che è 2^31 - 1?

+0

BTW Non utilizzare 'float' è possibile evitarlo. 'double' ti dà mezzo trilione di volte la precisione. Alcuni suggeriscono di usare BigDecimal (non è la mia preferenza comunque) –

+0

Bene, questo esempio è solo per il gusto del campione. Non è un vero codice di vita. – dhblah

+0

Vero, è possibile effettuare lo stesso confronto con Long.MAX_VALUE e doppio. –

risposta

8

Come fa a mantenere max_value di numero intero, che è 2^31 - 1?

In realtà no. Il valore di f è 2147483648.

Tuttavia, il valorea int stringe il valore. Si arriva a questa parte:

  • In caso contrario, uno dei due casi seguenti devono essere vere:

    • Il valore deve essere troppo piccolo (un valore negativo di grande portata o infinito negativo), e il risultato del primo passo è il più piccolo valore rappresentabile di tipo int o long.

    • Il valore deve essere troppo grande (un valore positivo di grande magnitudine o infinito positivo) e il risultato del primo passo è il valore rappresentabile massimo di tipo int o long.

Si può vedere questo facilmente, rendendo il numero ancora più grande:

float f = Integer.MAX_VALUE; 
f = f * 1000; 
System.out.println(Integer.MAX_VALUE); // 2147483647 
System.out.println((int)f); // 2147483647 

O per colata a long invece, che ovviamente non ha bisogno di essere bloccato allo stesso point:

float f = Integer.MAX_VALUE; 
System.out.println(Integer.MAX_VALUE); // 2147483647 
System.out.println((long)f); // 2147483648 
+1

E questo è ciò che ho per fare l'esempio http://ideone.com/p1pZnE prima :) –

+0

@dionadar: Mi piace la tua idea di lanciare a 'long' invece. Aggiungerò questo alla mia risposta, se va bene per te. –

+1

Ovviamente! Dopotutto era destinato ad aiutare l'OP. –

Problemi correlati