Estaba escribiendo este código:
public static void main(String[] args) {
double g = 1 / 3;
System.out.printf("%.2f", g);
}
El resultado es 0. ¿Por qué es esto y cómo resuelvo este problema?
fuente
Estaba escribiendo este código:
public static void main(String[] args) {
double g = 1 / 3;
System.out.printf("%.2f", g);
}
El resultado es 0. ¿Por qué es esto y cómo resuelvo este problema?
Los dos operandos (1 y 3) son números enteros, por lo tanto, se utiliza la aritmética de números enteros (división aquí). Declarar la variable de resultado como doble solo provoca una conversión implícita después de la división .
La división de enteros, por supuesto, devuelve el resultado real de la división redondeada hacia cero. Por tanto, el resultado de 0.333...
se redondea aquí a 0. (Tenga en cuenta que el procesador en realidad no realiza ningún redondeo, pero aún puede pensarlo de esa manera).
Además, tenga en cuenta que si ambos operandos (números) se dan como flotantes; 3.0 y 1.0, o incluso solo el primero , luego se usa aritmética de punto flotante, lo que le da 0.333...
.
int i = .99999999
establece int en 0. Más específicamente, toma la parte entera y descarta el resto.DOWN
es hacia cero. El redondeoFLOOR
es hacia el infinito negativo.1/3
usa la división de enteros ya que ambos lados son enteros.Necesitas que al menos uno de ellos sea
float
odouble
.Si está ingresando los valores en el código fuente como su pregunta, puede hacerlo
1.0/3
; el1.0
es un doble.Si obtiene los valores de otro lugar, puede usarlos
(double)
para convertir el archivoint
en undouble
.fuente
Echarlo explícitamente como un
double
Esto sucede porque Java usa la operación de división de enteros para
1
y3
desde que los ingresó como constantes enteras.fuente
Deberías usar
o
La división de enteros devuelve un entero.
fuente
Porque estás haciendo una división de enteros.
Como dice @Noldorin, si ambos operadores son enteros, entonces se usa la división de enteros.
El resultado 0.33333333 no se puede representar como un número entero, por lo tanto, solo se asigna la parte entera (0) al resultado.
Si alguno de los operadores es
double
/float
, entonces se llevará a cabo la aritmética de punto flotante. Pero tendrás el mismo problema si haces eso:fuente
Porque trata 1 y 3 como números enteros, por lo tanto, redondea el resultado a 0, de modo que sea un número entero.
Para obtener el resultado que está buscando, dígale explícitamente a Java que los números son dobles así:
fuente
Hacer el 1 se utilizará una división de flotador y flotador
fuente
La conversión en JAVA es bastante simple pero necesita algo de comprensión. Como se explica en el JLS para operaciones con números enteros :
Y un ejemplo es siempre la mejor manera de traducir el JLS;)
Un pequeño ejemplo que usa Eclipse para mostrar que incluso una adición de dos
short
s no será tan fácil:Esto requerirá una fundición con una posible pérdida de precisión.
Lo mismo es cierto para los operadores de punto flotante.
Entonces la promoción se hace en el flotador al doble.
Y la combinación de valores enteros y flotantes da como resultado valores flotantes como se dijo
Esto es cierto para los operadores binarios, pero no para los "Operadores de asignación" como
+=
Un simple ejemplo de trabajo es suficiente para probar esto.
La razón es que hay un reparto implícito hecho aquí, esto se ejecutará como
fuente
1 y 3 son contantes enteros, por lo que Java hace una división de enteros cuyo resultado es 0. Si desea escribir constantes dobles, debe escribir
1.0
y3.0
.fuente
La solución más sencilla es simplemente hacer esto
Lo que hace esto, ya que no ingresó 1.0 / 3.0, es permitirle convertirlo manualmente al tipo de datos double ya que Java asumió que era una división de enteros, y lo haría incluso si significara reducir la conversión. Esto es lo que se llama operador de conversión.
fuente
Hice esto.
Use .0 mientras hace cálculos dobles o de lo contrario Java asumirá que está usando Integers. Si un cálculo usa cualquier cantidad de valores dobles, entonces la salida será un valor doble. Si son todos enteros, la salida será un entero.
fuente
(1/3) significa división de números enteros, por eso no puede obtener un valor decimal de esta división. Para resolver este problema utilice:
fuente
Dado que tanto 1 como 3 son números enteros, el resultado no se redondea sino que se trunca. Entonces ignoras las fracciones y solo tomas enteros.
Para evitar esto, tenga al menos uno de sus números 1 o 3 como forma decimal 1.0 y / o 3.0.
fuente
Probar esto:
fuente
Haga "doble g = 1.0 / 3.0;" en lugar.
fuente
Muchos otros no han logrado señalar el problema real:
Esto necesariamente significa que los resultados de coma flotante, que podrían mostrarse como un número entero, se truncarán (recortar la parte decimal).
Que es casting (encasillado / conversión de tipo)?
Varía según la implementación del lenguaje, pero Wikipedia tiene una visión bastante completa y habla de coerción. , que es una pieza fundamental de información para responder a su pregunta.
http://en.wikipedia.org/wiki/Type_conversion
fuente
1/2
, no en el idioma de destino (java). Simplemente invoca una división de enteros, que dará como resultado un resultado entero. La conversión de tipos se debe únicamente a la conversión ascendente deint
a adouble
durante la asignación.0.5
. Simplemente, en Java,1/2
es una división de enteros, lo que resulta en un entero cero. Puede asignar un cero a un doble, seguirá siendo un cero, aunque sea un0.0
doble.