Diferença entre Math.Floor () e Math.Truncate ()

422

Qual é a diferença entre Math.Floor()e Math.Truncate()no .NET?

Usuário anônimo
fonte
8
por exemplo Math.Floor (5.4) = 5 Math.Truncate (5.4) = 5
subramani
3
você realmente precisa disso depois de 10 anos? lol
L_Church
1
por que depois de 10 anos há uma recompensa? já existem muitas respostas. há algo que estou perdendo aqui?
Puddle
3
Esse cara fez apenas 1 pergunta e saiu do site desde então. Eu acho que é tudo o que ele sempre quis saber ..: D
Nikos

Respostas:

484

Math.Floorarredonda para baixo, Math.Ceilingarredonda para cima e Math.Truncatearredonda para zero. Assim, Math.Truncateé como Math.Floorpara números positivos e como Math.Ceilingpara números negativos. Aqui está a referência .

Para completar, Math.Roundarredonda para o número inteiro mais próximo. Se o número estiver exatamente no meio do caminho entre dois números inteiros, ele arredonda para o número par. Referência.

Veja também: Resposta de Pax Diablo . Altamente recomendado!

Chris Jester-Young
fonte
31
@ Chris, eu sugiro que você corrija sua descrição de Round, há duas maneiras de arredondar (AwayFromZero e ToEven) e não arredondam para o número inteiro mais próximo, pois também podem fazer arredondamentos fracionários.
23420
1
Portanto, apenas um pequeno complemento à pergunta original - qual é a diferença entre Math.Truncate e apenas converter um decimal ou duplo para int? não seria apenas arredondar para zero?
Noam Gal
8
Quando é (int)myDoublediferente (int)Math.Truncate(myDouble)?
MPEN
2
O que é (int) igual na aula de matemática?
Lei Yang
386

Siga estes links para as descrições do MSDN de:

  • Math.Floor, que arredonda para o infinito negativo.
  • Math.Ceiling, que arredonda para o infinito positivo.
  • Math.Truncate, que arredonda para cima ou para baixo em direção a zero.
  • Math.Round, que arredonda para o número inteiro mais próximo ou o número especificado de casas decimais. Você pode especificar o comportamento se ele for exatamente equidistante entre duas possibilidades, como o arredondamento para que o dígito final seja par (" Round(2.5,MidpointRounding.ToEven)" se torne 2) ou para que fique mais longe de zero (" Round(2.5,MidpointRounding.AwayFromZero)" se torne 3).

O diagrama e tabela a seguir podem ajudar:

-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

Observe que Roundé muito mais poderoso do que parece, simplesmente porque pode arredondar para um número específico de casas decimais. Todos os outros arredondam para zero decimais sempre. Por exemplo:

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

Com as outras funções, você deve usar truques de multiplicar / dividir para obter o mesmo efeito:

c = System.Math.Truncate (n * 100) / 100;                    // 3.14
d = System.Math.Ceiling (n * 100) / 100;                     // 3.15
paxdiablo
fonte
7
Pax, acho que você cometeu um erro com: Round (AwayFromZero) -3 -2 1 2 3 Math.Round (-1,2, MidpointRounding.AwayFromZero) == -1 Math.Round (0,3, MidpointRounding.AwayFromZero) == 0,0 etc ..
dtroy 5/05/09
1
Obrigado, @dtroy, nunca tive a necessidade de usar esse modo e, enquanto o documentava corretamente se o texto, entendi totalmente os exemplos. Espero que isso esteja resolvido agora.
5609
Desculpe comentar uma pergunta tão antiga, mas eu tenho que perguntar: Como você pode arredondar "ToEven" para duas casas decimais? Certamente estranho e até aplicável apenas a números inteiros?
Richiban
4
@ Richiban, pense evencomo uma propriedade do dígito final no número arredondado, não como significando que o número inteiro deve ser um múltiplo de dois. By the way, desculpe, demorou tanto tempo para voltar para você, espero que você não esteja apenas sentado esperando a minha resposta :-) #
384
62

Math.Floor() arredonda para o infinito negativo

Math.Truncate arredonda para cima ou para baixo em direção a zero.

Por exemplo:

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

enquanto

Math.Floor(3.4)     = 3
Math.Truncate(3.4)  = 3
Azhar
fonte
2
Explanação agradável e simples com um pequeno exemplo, isso deve ser marcado como a resposta a esta pergunta.
Nvs1978
44

Alguns exemplos:

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
fonte
29

Math.floorsliiiide para a esquerda ...
Math.ceilsliiiide para a direita ...
Math.truncatecriiiiss crooooss (piso / teto sempre em direção a 0)
Math.roundcha cha, bem suave ... (vá para o lado mais próximo)

Vamos trabalhar! (⌐ □ _ □)

Para a esquerda ... Math.floor
Volte agora ... --
Dois saltos desta vez ...-=2

Todo mundo bate palmas ✋✋

Quão baixo você pode ir? Você pode descer baixo? Todo o caminho para o floor?

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

Math.truncate(x)também é o mesmo que int(x).
removendo uma fração positiva ou negativa, você está sempre indo para o zero.

Poça
fonte
HAHAHA bom remix.
Daniel diz Reinstate Monica
26

Eles são funcionalmente equivalentes a números positivos. A diferença está em como eles lidam com números negativos.

Por exemplo:

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

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

Links do MSDN: - Método Math.Floor - Método Math.Truncate

PS Cuidado com Math.Round pode não ser o que você espera.

Para obter o resultado do arredondamento "padrão", 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
fonte
24

Tente isso, Exemplos:

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

Também 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()

Retorna o maior número inteiro menor ou igual ao número especificado. MSDN system.math.floor

math.truncate()

Calcula a parte integrante de um número. MSDN system.math.truncate

safin chacko
fonte
23

Math.Floor()arredonda "em direção ao infinito negativo", em conformidade com a seção 4 da norma IEEE 754 .

Math.Truncate() arredonda "para o número inteiro mais próximo em direção a zero".


fonte
15

Math.Floor(): Retorna o maior número inteiro menor ou igual ao número de ponto flutuante de precisão dupla especificado.

Math.Round(): Arredonda um valor para o número inteiro mais próximo ou para o número especificado de dígitos fracionários.

Pinky
fonte
1
O OP perguntou sobre a diferença entre Floor()e Truncate(), não Floor()e Round().
Robert Columbia
5

Math.floor()sempre arredondará para baixo, ou seja, retornará LESSER inteiro. While round()retornará o número inteiro MAIS PRÓXIMO

math.floor ()

Retorna o maior número inteiro menor ou igual ao número especificado.

math.truncate ()

Calcula a parte integrante de um número.

vidy
fonte
0

Truncar descarta o decimal ****

Paul Moore
fonte