2012-03-17 8 views
55

No sé por qué f o F se coloca después de los valores float en Java u otros idiomas? por ejemplo,¿por qué f se coloca después de los valores de flotación?

float fVariable = 12.3f; 

¿Tiene alguna otra característica que no sea indicar que se trata de un valor flotante?

+0

La misma pregunta: [Java: ¿Por qué necesita especificar una 'f' en un literal flotante?] (Http://stackoverflow.com/questions/14102955/java-why-do-you-need-to- especifica-af-en-un-flotante-literal) –

Respuesta

44

por defecto es 12.3double literal, por así decir compilador para tratarlo como float explícitamente -> se utiliza f o F

21

float y double sólo puede proporcionar valores de representación aproximada para algunos valores. p.ej. 12,3 o 0,1

La diferencia es que flotador no es tan precisa (ya que tiene menos precisión, porque su más pequeño)

por ejemplo

System.out.println("0.1f == 0.1 is " + (0.1f == 0.1)); 
System.out.println("0.1f is actually " + new BigDecimal(0.1f)); 
System.out.println("0.1 is actually " + new BigDecimal(0.1)); 

impresiones

0.1f == 0.1 is false 
0.1f is actually 0.100000001490116119384765625 
0.1 is actually 0.1000000000000000055511151231257827021181583404541015625 

Así 0.1 es la representación más cercana de double y 0.1f es la representación más cercana en float

+0

¡Genial !, pero ¿cuál es real (matemática) 0.1 y cuál es igual a String.valueOf ("0.1")? –

+2

Solo el BigDecimal es exactamente igual. El resto dar la respuesta correcta cuando se convierte a String si se usa correctamente. –

5

flotador fVariable = 12,3; está bien. pero cuando usas solo el valor flotante (sin ningún identificador) en cualquier expresión en ese momento, necesitas decirle al compilador que el valor es flotante, por lo tanto usamos el sufijo "f" después del valor. ejemplo

float fl = 13f/5f;

aquí 13 y 5 son valores flotantes.

39

Como las formas de representar un número en su programa son muy variadas, los diseñadores de Java tuvieron que elegir y asignar cada formulario al caso de uso más común. Para los formularios seleccionados como predeterminados, el sufijo que denota el tipo exacto es opcional.

  • Para literales enteros (int, largo), el valor predeterminado es int. Por razones obvias .
  • Para literales de punto flotante (flotante, doble) el valor predeterminado es doble. Porque usar el doble potencialmente permite más seguro aritmético en los valores almacenados .

Por lo tanto, cuando se escribe 12 en su programa, eso es un int literal, en contraposición a 12L, que es una larga . Y cuando escribe 12.3, eso es doble literal, a diferencia de 12.3F, que es flotador.

Entonces, ¿dónde es esto relevante? Principalmente al manejar downcasts o reducir conversiones. Cada vez que desciende un largo a un int, o un doble a un float, existe la posibilidad de pérdida de datos.Por lo tanto, el compilador le obligará a indicar que realmente que desee realizar la conversión de restricción, señalizando un error de compilación para algo como esto:

float f = 12.3; 

Debido a 12.3 representa un doble, que tiene que explícitamente echarlo a flotar (básicamente terminando en la conversión de estrechamiento). De lo contrario, podría indicar que el número es realmente un flotante, usando el sufijo correcto;

float f = 12.3f; 

Así también resumir, tener que especificar un sufijo para anhela y flotadores es un compromiso de los diseñadores del lenguaje eligieron, con el fin de equilibrar la necesidad de especificar qué es exactamente un número es, con la flexibilidad de convertir números de un tipo de almacenamiento a otro.

+1

Vale la pena señalar que si 'd' es la mejor representación' doble' de alguna cantidad numérica 'x',' float f = (float) d' será la más cercana 'float' a algún valor que está dentro de una parte por billón de' x', aunque requiere un tipocast. Por el contrario, si 'f' es la mejor representación' float' de algún valor numérico 'x',' double d = f' no requerirá un tipocast aunque a menudo no esté cerca del mejor 'doble 'representación de' x', y puede estar desactivada por * cientos de órdenes de magnitud *. Me parece irónico que 'float f = (float) (1.0/10.0)' necesite un molde, pero 'double d = 1.0f/10.0f' no. – supercat

+0

"Por lo tanto, el compilador le obligará a indicar que realmente desea realizar la conversión de reducción, al señalar un error de compilación para algo como esto:" ¿Eso también debería aplicarse a long – RetroCode

+0

@Perception por qué escribe Por razones obvias en primer punto ¿puedes por favor elaborarlo? – ANinJa

0

El flotador es de coma simple IEEE 754 de coma flotante de doble precisión y el doble es de coma flotante doble precisión IEEE 754 de 64 bits. Cuando usas un valor con puntos decimales y si no especificas que es como 0.23f (específicamente float), java lo identifica como un doble.

Para valores decimales, el tipo de datos doble es generalmente la opción predeterminada tomada por java. Check This

1

Durante la compilación, todos los números de coma flotante (números con coma decimal) se establecen por defecto en el doble.

Por lo tanto, si usted no quiere que su número se duplique y sólo quiere como flotador, hay que indicar explícitamente al compilador mediante la adición de un f o F al final de la constante literal.

Cuestiones relacionadas