- 1 1. ¿Qué significa “truncar decimales” en Java?
- 2 2. Si solo quieres un int, el casting funciona (pero hay una trampa)
- 3 3. Usa Math.floor / Math.ceil para truncar decimales correctamente
- 4 4. Cómo truncar en la n‑ésima posición decimal (común en visualización y cálculos)
- 5 5. Truncar con BigDecimal (Más seguro para finanzas, facturación y tarifas)
- 6 6. DecimalFormat / String.format son solo para visualización (No uses para cálculos)
- 7 7. Best Practices by Use Case (Quick Reference)
- 8 8. Errores Comunes y Advertencias Clave
- 9 9. Resumen: Conclusiones para Copiar‑Pegar
- 10 Preguntas frecuentes
- 10.1 Q1. ¿Cuál es la forma más fácil de truncar decimales en Java?
- 10.2 Q2. ¿Por qué (int) da resultados inesperados con números negativos?
- 10.3 Q3. ¿Cómo truncar a dos decimales (p. ej., 1.239 → 1.23)?
- 10.4 Q4. ¿Por qué Math.floor(x * 100) / 100 a veces produce valores incorrectos?
- 10.5 Q5. ¿Cuál es la forma correcta de truncar usando BigDecimal?
- 10.6 Q6. ¿Cuál es la diferencia entre RoundingMode.DOWN y FLOOR?
- 10.7 Q7. ¿Puedo truncar decimales con DecimalFormat?
- 10.8 Q8. ¿Cuándo debe aplicarse el truncamiento en los cálculos?
1. ¿Qué significa “truncar decimales” en Java?
Cuando la gente dice “truncar decimales” en Java, normalmente se refiere a eliminar la parte fraccionaria para obtener un entero o descartar dígitos después del n‑ésimo decimal.
En el código real, sin embargo, “truncar” puede significar más de una cosa, así que aclararemos la conclusión primero.
1.1 ¿“Truncar” significa floor? ¿O cast? (Terminología)
Existen principalmente dos patrones de “truncamiento”.
- (A) Truncamiento hacia 0 (truncate) Elimina la parte fraccionaria, pero para números negativos se mueve “más cerca de cero”. Ejemplos:
3.9 → 3,-3.9 → -3→ En Java, el casting a (int) se comporta de esta manera - (B) Truncamiento hacia −∞ (floor) Se desplaza hacia abajo (hacia valores menores) en la recta numérica Ejemplos:
3.9 → 3,-3.9 → -4→ En Java, Math.floor() se comporta de esta manera
Los principiantes a menudo se confunden porque para números positivos, (A) y (B) producen el mismo resultado.
Pero en el momento en que manejas números negativos, los resultados divergen.
1.2 Qué ayuda a lograr este artículo (ruta más rápida según caso de uso)
Quienes buscan “java truncate decimals” normalmente quieren una de las siguientes cosas.
- Simplemente convertir a entero (p. ej., 3.14 → 3) → El casting con
(int)es lo más rápido. Pero hay que tener cuidado con los números negativos. - Truncar a 2 decimales (p. ej., 1.239 → 1.23) →
Math.floor(x * 100) / 100puede servir → Pero si la precisión es importante, BigDecimal es más seguro - Dinero/facturación/tarifas donde los errores son inaceptables → Usa BigDecimal + setScale + RoundingMode
Si eliges el método equivocado, a menudo “parece funcionar” pero falla más adelante.
En particular, los cálculos basados en double pueden introducir errores de precisión, por lo que para lógica relacionada con dinero es más seguro diseñar con BigDecimal desde el principio.
1.3 Errores comunes (corrígelos primero)
Tres equivocaciones habituales son:
- Suponer que (int) siempre equivale a floor → En realidad redondea hacia cero, por lo que los números negativos difieren.
- Usar Math.floor para truncar decimales y obtener ligeras discrepancias → A menudo causado por la precisión de
double(depende de los valores/entorno). - Utilizar formateo (DecimalFormat, etc.) como si cambiara el valor calculado → La visualización puede cambiar mientras el valor interno permanece igual.
Primero confirma el camino más corto: “Si solo necesitas un entero, haz casting”. Luego comprende la “trampa de los números negativos”.
En la siguiente sección explicaremos el truncamiento mediante casting a (int) con ejemplos concretos.
2. Si solo quieres un int, el casting funciona (pero hay una trampa)
Si solo deseas eliminar la parte fraccionaria y obtener un entero (int), el enfoque más rápido en Java es el casting (conversión de tipo).
Pero el casting no es “truncamiento matemático (floor)”. Es redondeo hacia cero (truncate), lo cual importa mucho.
2.1 Conceptos básicos: truncar la parte fraccionaria con (int)
Cuando conviertes un double o float a int, la parte fraccionaria se descarta.
double x = 3.99;
int a = (int) x;
System.out.println(a); // 3
Esta es la respuesta más sencilla para la intención común “quiero truncar decimales”.
Los pasos son:
- Confirmar que el valor es un
double/float - Añadir
(int)para convertirlo aint - Verificar el resultado—incluidos los números negativos si pueden aparecer
2.2 Importante: el casting redondea hacia cero (los números negativos difieren)
Esta es la trampa número 1 para los principiantes.
El casting no siempre “redondea al valor menor”.
System.out.println((int) 3.9); // 3
System.out.println((int) -3.9); // -3
-3.9 se convierte en -3 (no en -4) porque el casting convierte en la dirección más cercana a cero.
3.9 → 3(hacia cero)-3.9 → -3(hacia cero)
Si deseas “truncamiento matemático (floor)”, necesitas Math.floor(), no el casting.
Si pasas por alto esto, puedes obtener errores en cosas como cálculos de P&L, de comisiones o de coordenadas, donde solo el lado negativo está equivocado.
2.3 Errores comunes: Suponer redondeo / Fallos con negativos
El casting no equivale a redondear al número más cercano.
Si piensas que “0,9 se convierte en 1”, estarás equivocado.
System.out.println((int) 0.9); // 0
System.out.println((int) 1.9); // 1
Además, con números negativos puede parecer que el valor “aumentó” o “disminuyó” de forma inesperada.
-3.9 → -3se mueve en la dirección mayor en la recta numérica- Si esperabas
-4, eso es un error real
La solución es sencilla:
- Si solo manejas valores positivos → el casting está bien
- Si pueden aparecer valores negativos → considera
Math.floor() - Si se requiere precisión estricta (dinero, etc.) → considera
BigDecimal
En la siguiente sección explicaremos Math.floor() / Math.ceil(), que permite truncar de forma matemáticamente consistente incluso con números negativos.
3. Usa Math.floor / Math.ceil para truncar decimales correctamente
Si deseas truncar decimales de forma matemáticamente correcta, el enfoque básico es usar Math.floor() en lugar de casting.
Especialmente cuando pueden aparecer números negativos, elegir simplemente Math.floor() reduce significativamente los errores.
3.1 Truncamiento con Math.floor() (Función piso)
Math.floor() se denomina función piso y redondea los valores hacia abajo (hacia valores menores) en la recta numérica.
System.out.println(Math.floor(3.9)); // 3.0
System.out.println(Math.floor(-3.9)); // -4.0
Puntos clave:
3.9 → 3.0(se mueve hacia abajo)-3.9 → -4.0(se mueve aún más hacia abajo)
La mayor ventaja es que el truncamiento no se comporta de forma inesperada con números negativos.
Una trampa frecuente es que Math.floor() devuelve un double.
Si necesitas un entero, debes convertirlo después.
3.2 Math.ceil() redondea hacia arriba — No lo confundas
Math.ceil() es lo opuesto a Math.floor() y redondea hacia arriba (hacia valores mayores) en la recta numérica.
System.out.println(Math.ceil(3.1)); // 4.0
System.out.println(Math.ceil(-3.1)); // -3.0
Un error común es:
- Pensar que “eliminar decimales” equivale a
ceil→ En realidad, ceil redondea hacia arriba, lo que a menudo es lo contrario de lo que se desea.
Si buscas “truncar decimales”, floor suele ser la elección correcta.
3.3 Conversión de tipo al convertir a long / int
Si deseas convertir el resultado de Math.floor() a int o long, necesitas hacer un casting.
double x = -3.9;
int a = (int) Math.floor(x);
System.out.println(a); // -4
Aspectos a vigilar:
- El resultado de
Math.floor()es undouble - Hacer casting a
intelimina la parte decimal (no hay desajuste en esta etapa) - Si el valor es demasiado grande, puede no caber en un
int
Para mayor seguridad, puedes elegir long primero.
double x = 12345678901.9;
long b = (long) Math.floor(x);
System.out.println(b); // 12345678901
Errores habituales incluyen:
- Olvidar hacer el casting y dejar el valor como double
- No comprender la diferencia entre floor y casting, lo que genera fallos con negativos
- Desbordamiento al superar el rango de int
En resumen, si pueden involucrarse números negativos, lo más seguro es diseñar desde el principio alrededor de Math.floor().
En la siguiente sección explicaremos cómo truncar en la n‑ésima posición decimal (por ejemplo, manteniendo dos decimales) con ejemplos concretos.
4. Cómo truncar en la n‑ésima posición decimal (común en visualización y cálculos)
En aplicaciones reales es muy frecuente querer conservar hasta una cierta posición decimal y descartar el resto, no solo eliminar todos los decimales.
Ejemplos incluyen tasas impositivas, tipos de cambio, precios unitarios y porcentajes.
Aquí organizamos formas prácticas de truncar en la n‑ésima posición decimal.
Al usar double, pueden aparecer problemas de precisión, por lo que también abordaremos esas trampas.
4.1 Patrón básico: multiplicar por 10ⁿ, aplicar floor y luego dividir
- Decida el número de decimales
n - Multiplique por
10^n - Aplique
Math.floor() - Divida por
10^npara restaurar la escala
Para truncar a 2 decimales (p.ej., 1.239 → 1.23):
double x = 1.239;
double y = Math.floor(x * 100) / 100;
System.out.println(y); // 1.23
Para truncar a 3 decimales (p.ej., 1.2399 → 1.239):
double x = 1.2399;
double y = Math.floor(x * 1000) / 1000;
System.out.println(y); // 1.239
Ventajas de este enfoque:
- Código corto y sencillo
- Utiliza
Math.floor(), por lo que el comportamiento con números negativos es consistente - No se requieren bibliotecas adicionales
Sin embargo, como esto depende de double, no es adecuado para cálculos estrictos como el dinero.
4.2 Trampa: Resultados inesperados debido a la precisión de double
El double de Java es un tipo de punto flotante y no siempre puede representar valores como 0.1 o 0.01 de forma exacta.
Como resultado, puede observar discrepancias aparentemente “sin sentido” (dependiendo de los valores y del entorno).
- Usted espera
1.29, pero aparece como1.28 - Usted maneja
0.3, pero internamente es0.299999999...
Por ejemplo, el siguiente código parece lógicamente correcto:
double x = 1.29;
double y = Math.floor(x * 100) / 100;
System.out.println(y);
Pero internamente, x * 100 puede representarse como 128.999999999....
Si floor devuelve 128, el resultado se convierte en 1.28.
Esto no es un error en Java, sino una propiedad de la aritmética de punto flotante.
Lo complicado es que esto ocurre solo ocasionalmente, lo que dificulta detectarlo durante las pruebas.
4.3 Truncar de forma segura con BigDecimal (Recomendado)
Si desea truncar en el n‑ésimo decimal de forma fiable, usar BigDecimal es la opción más segura.
BigDecimal maneja números en base 10 de forma exacta y se usa comúnmente en cálculos monetarios.
El patrón básico es:
import java.math.BigDecimal;
import java.math.RoundingMode;
BigDecimal x = new BigDecimal("1.239");
BigDecimal y = x.setScale(2, RoundingMode.DOWN); // truncate at 2 decimal places
System.out.println(y); // 1.23
Puntos clave:
setScale(2, ...)mantiene dos decimalesRoundingMode.DOWNespecifica truncamiento hacia cero
Observe que DOWN de BigDecimal no es lo mismo que Math.floor().
Con números negativos, el comportamiento difiere, por lo que también podría necesitar considerar FLOOR (explicado más adelante).
Los errores comunes incluyen:
- Crear BigDecimal a partir de un double (introduciendo errores de precisión)
- Olvidar llamar a
setScale - Usar el modo de redondeo incorrecto y redondear accidentalmente al alza
En resumen, Math.floor puede ser suficiente solo para propósitos de visualización, pero para cálculos importantes, BigDecimal es la opción más segura.
En la siguiente sección, profundizaremos en el truncamiento con BigDecimal, incluyendo la forma correcta de crear instancias para código del mundo real.
5. Truncar con BigDecimal (Más seguro para finanzas, facturación y tarifas)
Si desea truncar decimales con máxima precisión, BigDecimal debería ser su primera opción en Java.
double es rápido pero propenso a errores de precisión, lo que a menudo causa problemas más adelante en cálculos de dinero, facturación, comisiones o tarifas.
BigDecimal maneja números decimales de una forma más cercana a las expectativas humanas, por lo que se usa ampliamente en código empresarial.
5.1 Conceptos básicos de BigDecimal: crear a partir de double es peligroso (Lo más importante)
Un error muy común con BigDecimal es cómo se crea.
Si pasa un double directamente, el error de precisión interno puede conservarse.
import java.math.BigDecimal;
BigDecimal a = new BigDecimal(0.1);
System.out.println(a); // May become something like 0.10000000000000000555...
Truncar o calcular con este valor a menudo conduce a discrepancias “misteriosas”.
Formas seguras de crear BigDecimal son:
(A) Crear a partir de una cadena (más explícito y seguro)
BigDecimal a = new BigDecimal("0.1");
(B) Usar BigDecimal.valueOf(double) (a menudo recomendado)
BigDecimal a = BigDecimal.valueOf(0.1);
Para principiantes, la regla más segura es: cuando tengas dudas, crea BigDecimal a partir de un String.
5.2 Truncar en n lugares decimales con RoundingMode.DOWN
Para truncar en el n-ésimo lugar decimal, usa setScale.
setScale(2, ...)→ mantener dos lugares decimalesRoundingMode.DOWN→ truncar hacia ceroimport java.math.BigDecimal; import java.math.RoundingMode; BigDecimal x = new BigDecimal("123.4567"); BigDecimal y = x.setScale(2, RoundingMode.DOWN); System.out.println(y); // 123.45
Si quieres eliminar todos los decimales y obtener un valor similar a un entero, se aplica el mismo enfoque.
BigDecimal x = new BigDecimal("123.999");
BigDecimal y = x.setScale(0, RoundingMode.DOWN);
System.out.println(y); // 123
Un detalle importante: setScale cambia el valor en sí, no solo cómo se muestra.
Esto es una operación de cálculo, no de formateo.
5.3 Truncar hacia cero vs dirección de piso (Diferencia importante)
BigDecimal ofrece múltiples modos de redondeo, y hay dos que parecen “truncamiento”, lo que puede ser confuso.
RoundingMode.DOWN : truncar hacia cero
3.9 → 3-3.9 → -3RoundingMode.FLOOR : truncar hacia −∞ (piso matemático)
3.9 → 3-3.9 → -4
Si quieres que los valores siempre se muevan hacia el lado más pequeño en la recta numérica, FLOOR es la elección correcta.
import java.math.BigDecimal;
import java.math.RoundingMode;
BigDecimal x1 = new BigDecimal("-3.9");
System.out.println(x1.setScale(0, RoundingMode.DOWN)); // -3
System.out.println(x1.setScale(0, RoundingMode.FLOOR)); // -4
Cuál es “correcto” depende enteramente de tu caso de uso.
- Simplemente eliminar dígitos (truncar) →
DOWN - Truncamiento matemático (piso) →
FLOOR
Si esta distinción no está clara, los valores negativos pueden causar errores graves de especificación.
5.4 Errores comunes con BigDecimal
Aquí hay errores frecuentes al truncar con BigDecimal:
- Crear BigDecimal a partir de double e introducir errores de precisión → Evita
new BigDecimal(0.1); usa String ovalueOf - Usar la escala incorrecta → Por ejemplo, usar 0 en lugar de 2 lugares decimales
- Confundir los modos de redondeo → Confundir DOWN y FLOOR, causando problemas con números negativos
- Cambiar valores cuando solo querías formatear →
setScalecambia el valor; separa el cálculo y la visualización
En resumen, para dinero, facturación o tasas—donde incluso una diferencia de un centavo importa—
usa BigDecimal y corrige tanto el método de creación como el modo de redondeo.
En la siguiente sección, explicaremos cómo evitar confundir el formateo de visualización y el truncamiento de cálculo.
6. DecimalFormat / String.format son solo para visualización (No uses para cálculos)
Al truncar decimales, es crucial distinguir si quieres truncar el valor calculado o solo formatear la visualización.
Mezclar estos dos lleva a situaciones donde la pantalla se ve correcta pero el valor interno está equivocado, causando errores más tarde.
La lección clave: DecimalFormat y String.format son solo para visualización.
Si necesitas truncar el valor real, usa BigDecimal o Math.floor().
6.1 Formatear lugares decimales con DecimalFormat (Truncamiento posible)
DecimalFormat es una clase para convertir números en cadenas formateadas.
Por ejemplo, se usa a menudo cuando quieres mostrar dos lugares decimales.
import java.text.DecimalFormat;
double x = 1.239;
DecimalFormat df = new DecimalFormat("0.00");
System.out.println(df.format(x)); // May become 1.24 (rounded)
Lo importante es que el valor de retorno de format() es un String,
y el valor numérico de x en sí no cambia.
También puedes especificar el modo de redondeo.
Para truncar la visualización, haz lo siguiente:
import java.text.DecimalFormat;
import java.math.RoundingMode;
double x = 1.239;
DecimalFormat df = new DecimalFormat("0.00");
df.setRoundingMode(RoundingMode.DOWN);
System.out.println(df.format(x)); // 1.23
However, this only changes the displayed string; the value of x remains unchanged.
6.2 Caveats When Using String.format
String.format also lets you control numeric output formatting.
double x = 1.239;
System.out.println(String.format("%.2f", x)); // A menudo redondea a 1.24
In many cases, String.format("%.2f", x) performs round half up behavior.
It’s usually unsuitable if you specifically want truncation.
A very common beginner mistake is converting a formatted string back into a number and using it in calculations.
double x = 1.239;
String s = String.format("%.2f", x); // "1.24"
double y = Double.parseDouble(s); // 1.24
// En este punto, los cálculos usan un valor redondeado, no truncado
This mixes display concerns into calculation logic, making future changes harder.

6.3 Key Pitfall: Correct Display Does Not Mean Correct Values
The most dangerous assumption is “it looks correct on the screen, so it must be fine.”
- DecimalFormat / String.format change how values look
- Math.floor / BigDecimal.setScale change the actual value
If you confuse these, you may run into problems like:
- The UI shows “$1.23” but internal calculations still sum “$1.239”
- Rounding happens at the wrong stage, causing billing totals to differ
- Display rounding leaks into calculations, causing audit discrepancies
A simple rule of thumb:
- Only formatting for display → DecimalFormat (or UI formatting)
- Truncating as part of calculation → BigDecimal / Math.floor
In the next section, we’ll provide a quick reference table so you can instantly choose the right approach by use case.
7. Best Practices by Use Case (Quick Reference)
“Java decimal truncation” is confusing because there are multiple valid approaches.
Here, we fix the decision by mapping use case → best solution, so you can choose quickly.
7.1 Convert to int (Positive Numbers Only) → Casting Is Enough
If you just want to remove decimals and convert to int, and negative numbers will never appear, casting is the fastest option.
double x = 12.99;
int y = (int) x;
System.out.println(y); // 12
Things to remember:
- Casting rounds toward zero
- With positive values, it looks the same as truncation
- If negatives may appear, don’t lock in this approach
7.2 Truncate Including Negative Numbers → Math.floor
If you want mathematical truncation (floor), Math.floor() is the correct choice.
It’s safer than casting when negative numbers may occur.
double x = -3.9;
int y = (int) Math.floor(x);
System.out.println(y); // -4
Common notes:
Math.floor()returns adouble- Cast to
intorlongif needed - Watch out for
intoverflow with large values
7.3 Truncate at the n-th Decimal Place (Strict) → BigDecimal + setScale
If you want to truncate at a specific decimal place without precision errors, BigDecimal is the safest option.
import java.math.BigDecimal;
import java.math.RoundingMode;
BigDecimal x = new BigDecimal("1.239");
BigDecimal y = x.setScale(2, RoundingMode.DOWN);
System.out.println(y); // 1.23
This approach is ideal for:
- Money (JPY, USD, etc.)
- Billing and tax calculations
- Rate calculations where errors are unacceptable
- Batch jobs requiring deterministic results
Common pitfalls:
- Do not create BigDecimal from double (avoid
new BigDecimal(0.1)) - Understand the difference between DOWN and FLOOR (negative numbers)
7.4 Format for Display Only → DecimalFormat (Never for Calculation)
If you only want to format numbers for display (e.g., two decimals), DecimalFormat is convenient.
However, it does not change the underlying numeric value, so never use it for calculations.
import java.text.DecimalFormat;
import java.math.RoundingMode;
double x = 1.239;
DecimalFormat df = new DecimalFormat("0.00");
df.setRoundingMode(RoundingMode.DOWN);
System.out.println(df.format(x)); // "1.23"
Notas:
- El valor de retorno es un
String - Mezclar la lógica de presentación con los cálculos provoca errores
En una frase, la conclusión es:
- Rápido y sencillo → Casting
- Correcto con negativos → Math.floor
- Precisión primero (caso real) → BigDecimal
- Solo para mostrar → DecimalFormat
A continuación, resumiremos los errores más comunes y cómo evitarlos.
8. Errores Comunes y Advertencias Clave
El truncamiento de decimales a menudo “parece funcionar”, lo que facilita que los principiantes pasen por alto errores sutiles.
A continuación, errores reales y cómo evitarlos.
8.1 Malinterpretar Qué Significa “Truncar” (Hacia 0 vs Floor)
El error más frecuente es asumir que truncar siempre significa “ir a un número menor”.
En Java, el significado depende del método.
Casting
(int): hacia cero3.9 → 3-3.9 → -3Math.floor(): hacia −∞3.9 → 3-3.9 → -4
Si pueden aparecer valores negativos y utilizas casting, solo el lado negativo será incorrecto.
Esto suele pasar desapercibido si las pruebas solo usan valores positivos.
Contramedidas:
- Si pueden aparecer negativos, considera
Math.floor()desde el principio - Con BigDecimal, no confundas
RoundingMode.DOWNyFLOOR
8.2 Resultados Inesperados Debido a la Precisión de double
Al implementar el truncamiento con Math.floor(x * 100) / 100, puedes observar discrepancias aun cuando la lógica parezca correcta.
La causa es la representación interna de double.
double x = 1.29;
double y = Math.floor(x * 100) / 100;
System.out.println(y);
Dependiendo del valor, x * 100 puede convertirse en 128.999999999..., lo que da como resultado 1.28.
Como esto no ocurre siempre, suele descubrirse en producción.
Contramedidas:
- Usa
BigDecimalpara dinero y facturación - Si usas double, limítalo a casos donde los pequeños errores sean aceptables
8.3 Usar double para Cálculos Monetarios
Utilizar double para dinero suele producir:
- Totales que no coinciden después del truncamiento
- Pequeños errores de redondeo que se acumulan
- Desfase entre los valores mostrados y los internos
Contramedidas:
- Usa
BigDecimalpara valores monetarios - Corrige el método de creación (String o
valueOf) - Documenta las reglas de redondeo explícitamente
8.4 Usar Formato de Presentación para Cálculos
Formatear con DecimalFormat o String.format y luego volver a convertir a números es peligroso.
double x = 1.239;
String s = String.format("%.2f", x); // display formatting
double y = Double.parseDouble(s); // used in calculation (dangerous)
Esto provoca:
- El redondeo de presentación se filtra en los cálculos
- Cambios en la especificación que afectan la lógica
- Pérdida de la separación entre presentación y cálculo
Contramedidas:
- Finaliza los cálculos con
BigDecimaloMath.floor() - Formatea solo en la etapa final de visualización
- Mantén cálculo y presentación separados
9. Resumen: Conclusiones para Copiar‑Pegar
Existen varias formas de truncar decimales en Java, pero la vía más rápida es elegir según el caso de uso.
A continuación, conclusiones listas para usar.
9.1 Si No Estás Seguro, Usa Estas
Caso 1: Convertir a int (Solo Números Positivos)
double x = 12.99;
int y = (int) x; // 12
Nota: Con números negativos, -3.9 → -3, por lo que no es el piso matemático.
Caso 2: Truncamiento Matemático Incluyendo Negativos
double x = -3.9;
int y = (int) Math.floor(x); // -4
Punto: Math.floor() trunca hacia −∞.
Caso 3: Truncar a n Decimales (double, simple)
*Usa solo cuando los pequeños errores de precisión sean aceptables.
double x = 1.239;
double y = Math.floor(x * 100) / 100; // 1.23
Advertencia: pueden aparecer problemas de precisión de double. Para una exactitud estricta, usa BigDecimal.
Caso 4: Truncar de forma fiable a n decimales (Recomendado)
import java.math.BigDecimal;
import java.math.RoundingMode;
BigDecimal x = new BigDecimal("1.239");
BigDecimal y = x.setScale(2, RoundingMode.DOWN); // 1.23
Puntos clave:
- No cree BigDecimal a partir de
double - Utilícelo para dinero, facturación y tarifas
Caso 5: Solo para visualización (Nunca para cálculo)
import java.text.DecimalFormat;
import java.math.RoundingMode;
double x = 1.239;
DecimalFormat df = new DecimalFormat("0.00");
df.setRoundingMode(RoundingMode.DOWN);
System.out.println(df.format(x)); // "1.23"
Nota: Esto produce una String; el valor numérico permanece sin cambios.
Preguntas frecuentes
Q1. ¿Cuál es la forma más fácil de truncar decimales en Java?
Respuesta: Si solo necesita un entero, el casting con (int) es el más rápido. Si pueden aparecer números negativos, considere Math.floor().
Q2. ¿Por qué (int) da resultados inesperados con números negativos?
Respuesta: El casting redondea hacia cero. Por ejemplo, -3.9 → -3. Para truncamiento matemático, use Math.floor().
Q3. ¿Cómo truncar a dos decimales (p. ej., 1.239 → 1.23)?
Respuesta: Para un enfoque sencillo, use Math.floor(x * 100) / 100. Para mayor precisión, use BigDecimal.setScale(2, RoundingMode.DOWN).
Q4. ¿Por qué Math.floor(x * 100) / 100 a veces produce valores incorrectos?
Respuesta: Esto se debe a errores de precisión de double. Para dinero o facturación, cambie a BigDecimal.
Q5. ¿Cuál es la forma correcta de truncar usando BigDecimal?
Respuesta: Cree BigDecimal a partir de una cadena o valueOf, luego use setScale(n, RoundingMode.DOWN). Evite new BigDecimal(double).
Q6. ¿Cuál es la diferencia entre RoundingMode.DOWN y FLOOR?
Respuesta: Difieren con números negativos. DOWN trunca hacia cero; FLOOR trunca hacia −∞. Elija según si desea truncar o aplicar el piso matemático.
Q7. ¿Puedo truncar decimales con DecimalFormat?
Respuesta: Puede truncar la visualización estableciendo un modo de redondeo, pero solo afecta la presentación. El valor interno no cambia.
Q8. ¿Cuándo debe aplicarse el truncamiento en los cálculos?
Respuesta: Depende de la especificación. Decida si truncar en cada paso o al final, documente la regla claramente y aplíquela de forma consistente—preferiblemente con BigDecimal.

