Diferencia entre Math.Floor () y Math.Truncate ()

422

¿Cuál es la diferencia entre Math.Floor()y Math.Truncate()en .NET?

Usuario anónimo
fuente
8
por ejemplo, Math.Floor (5.4) = 5 Math.Truncate (5.4) = 5
subramani
3
¿realmente necesitas esto después de 10 años? lol
L_Church
1
¿Por qué después de 10 años hay una recompensa? Ya hay muchas respuestas. ¿Hay algo que me estoy perdiendo aquí?
Charco
3
Este tipo solo hizo 1 pregunta y dejó el sitio desde entonces. Supongo que eso es todo lo que siempre quiso saber ..: D
Nikos

Respuestas:

484

Math.Floorredondea hacia abajo, Math.Ceilingredondea hacia arriba y Math.Truncateredondea hacia cero. Por lo tanto, Math.Truncatees como Math.Floorpara números positivos y como Math.Ceilingpara números negativos. Aquí está la referencia .

Para completar, se Math.Roundredondea al entero más cercano. Si el número está exactamente a medio camino entre dos enteros, entonces se redondea hacia el par. Referencia.

Ver también: la respuesta de Pax Diablo . ¡Muy recomendable!

Chris Jester-Young
fuente
31
@ Chris, le sugiero que arregle su descripción de Round, hay dos formas de redondear (AwayFromZero y ToEven) y no se redondea al número entero más cercano, ya que también puede hacer redondeo fraccional.
paxdiablo
1
Entonces, solo un pequeño agregado a la pregunta original: ¿cuál es la diferencia entre Math.Truncate y solo emitir un decimal o doble a int? ¿No sería simplemente redondear hacia cero?
Noam Gal
8
¿Cuándo (int)myDoubledifiere de (int)Math.Truncate(myDouble)?
mpen
2
¿A qué equivale (int) en la clase de matemáticas?
Lei Yang
386

Siga estos enlaces para las descripciones de MSDN de:

  • Math.Floor, que se redondea hacia el infinito negativo.
  • Math.Ceiling, que se redondea hacia el infinito positivo.
  • Math.Truncate, que se redondea hacia arriba o hacia abajo hacia cero.
  • Math.Round, que se redondea al número entero más cercano o al número especificado de lugares decimales. Puede especificar el comportamiento si es exactamente equidistante entre dos posibilidades, como redondear para que el dígito final sea par (" Round(2.5,MidpointRounding.ToEven)" se convierte en 2) o para que esté más alejado de cero (" Round(2.5,MidpointRounding.AwayFromZero)" se convierta en 3).

El siguiente diagrama y tabla pueden ayudar:

-3        -2        -1         0         1         2         3
 +--|------+---------+----|----+--|------+----|----+-------|-+
    a                     b       c           d            e

                       a=-2.7  b=-0.5  c=0.3  d=1.5  e=2.8
                       ======  ======  =====  =====  =====
Floor                    -3      -1      0      1      2
Ceiling                  -2       0      1      2      3
Truncate                 -2       0      0      1      2
Round (ToEven)           -3       0      0      2      3
Round (AwayFromZero)     -3      -1      0      2      3

Tenga en cuenta que Roundes mucho más poderoso de lo que parece, simplemente porque puede redondear a un número específico de decimales. Todos los demás redondean a cero decimales siempre. Por ejemplo:

n = 3.145;
a = System.Math.Round (n, 2, MidpointRounding.ToEven);       // 3.14
b = System.Math.Round (n, 2, MidpointRounding.AwayFromZero); // 3.15

Con las otras funciones, debe usar el truco de multiplicar / dividir para lograr el mismo efecto:

c = System.Math.Truncate (n * 100) / 100;                    // 3.14
d = System.Math.Ceiling (n * 100) / 100;                     // 3.15
paxdiablo
fuente
77
Pax, creo que tienes un error con: Round (AwayFromZero) -3 -2 1 2 3 Math.Round (-1.2, MidpointRounding.AwayFromZero) == -1 Math.Rounding (0.3, MidpointRounding.AwayFromZero) == 0.0 etc.
dtroy 05 de
1
Gracias, @dtroy, nunca he tenido la necesidad de usar ese modo y, aunque lo documenté correctamente en el texto, entendí totalmente mal los ejemplos. Espero que eso esté arreglado ahora.
paxdiablo 05 de
Lamento comentar una pregunta tan antigua, pero tengo que preguntar: ¿Cómo puede redondear "ToEven" a dos decimales? ¿Seguramente extraño e incluso se aplica solo a enteros?
Richiban
44
@Richiban, piense que evenes una propiedad del último dígito en el número redondeado, no como que el número entero debe ser un múltiplo de dos. Por cierto, lo siento, me tomó tanto tiempo volver a contactarte, espero que no estuvieras sentado esperando mi respuesta :-)
paxdiablo
62

Math.Floor() redondea hacia el infinito negativo

Math.Truncate redondea hacia arriba o hacia abajo hacia cero.

Por ejemplo:

Math.Floor(-3.4)     = -4
Math.Truncate(-3.4)  = -3

mientras

Math.Floor(3.4)     = 3
Math.Truncate(3.4)  = 3
Azhar
fuente
2
Agradable y simple explicación con un breve ejemplo, esto debe marcarse como la respuesta a esta pregunta.
nivs1978
44

Algunos ejemplos:

Round(1.5) = 2
Round(2.5) = 2
Round(1.5, MidpointRounding.AwayFromZero) = 2
Round(2.5, MidpointRounding.AwayFromZero) = 3
Round(1.55, 1) = 1.6
Round(1.65, 1) = 1.6
Round(1.55, 1, MidpointRounding.AwayFromZero) = 1.6
Round(1.65, 1, MidpointRounding.AwayFromZero) = 1.7

Truncate(2.10) = 2
Truncate(2.00) = 2
Truncate(1.90) = 1
Truncate(1.80) = 1
Marek Grzenkowicz
fuente
29

Math.floorsliiiide a la izquierda ...
Math.ceilsliiiide a la derecha ...
Math.truncatecriiiiss crooooss (suelo / techo siempre hacia 0)
Math.roundcha cha, muy suave ... (ir al lado más cercano)

¡Vamos a trabajar! (⌐ □ _ □)

A la izquierda ... Math.floor
Tómalo de vuelta ahora ... --
Dos saltos esta vez ...-=2

Todos aplauden hands

¿Cuan bajo Puedes ir? ¿Puedes bajar? Todo el camino hasta el floor?

if (this == "wrong")
    return "i don't wanna be right";

Math.truncate(x)también es lo mismo que int(x).
Al eliminar una fracción positiva o negativa, siempre te diriges hacia 0.

Charco
fuente
HAHAHA buen remix.
Daniel dice reinstalar a Mónica
26

Son funcionalmente equivalentes con números positivos. La diferencia está en cómo manejan los números negativos.

Por ejemplo:

Math.Floor(2.5) = 2
Math.Truncate(2.5) = 2

Math.Floor(-2.5) = -3
Math.Truncate(-2.5) = -2

Enlaces de MSDN: - Método Math.Floor - Método Math.Truncate

PD: Cuidado con las matemáticas, puede que no sea lo que esperas.

Para obtener el resultado de redondeo "estándar", use:

float myFloat = 4.5;
Console.WriteLine( Math.Round(myFloat) ); // writes 4
Console.WriteLine( Math.Round(myFloat, 0, MidpointRounding.AwayFromZero) ) //writes 5
Console.WriteLine( myFloat.ToString("F0") ); // writes 5
Sandesh
fuente
24

Pruebe esto, ejemplos:

Math.Floor () vs Math.Truncate ()

Math.Floor(2.56) = 2
Math.Floor(3.22) = 3
Math.Floor(-2.56) = -3
Math.Floor(-3.26) = -4

Math.Truncate(2.56) = 2
Math.Truncate(2.00) = 2
Math.Truncate(1.20) = 1
Math.Truncate(-3.26) = -3
Math.Truncate(-3.96) = -3

También Math.Round ()

   Math.Round(1.6) = 2
   Math.Round(-8.56) = -9
   Math.Round(8.16) = 8
   Math.Round(8.50) = 8
   Math.Round(8.51) = 9

math.floor()

Devuelve el entero más grande menor o igual que el número especificado. MSDN system.math.floor

math.truncate()

Calcula la parte integral de un número. MSDN system.math.truncate

safin chacko
fuente
15

Math.Floor(): Devuelve el entero más grande menor o igual que el número de punto flotante de precisión doble especificado.

Math.Round(): Redondea un valor al entero más cercano o al número especificado de dígitos fraccionarios.

Meñique
fuente
1
El OP preguntó sobre la diferencia entre Floor()y Truncate(), no Floor()y Round().
Robert Columbia
5

Math.floor()siempre se redondeará hacia abajo, es decir, devuelve un entero MENOR. Mientras round()que devolverá el entero MÁS CERCANO

math.floor ()

Devuelve el entero más grande menor o igual que el número especificado.

math.truncate ()

Calcula la parte integral de un número.

vidy
fuente
0

Truncar cae el decimal ****

Paul Moore
fuente