Différence entre Math.Floor () et Math.Truncate ()


422

Quelle est la différence entre Math.Floor()et Math.Truncate()dans .NET?


8
Ex: Math.Floor (5.4) = 5 Math.Truncate (5.4) = 5
subramani

3
vous en avez vraiment besoin après 10 ans bizarres? lol
L_Church

1
pourquoi après 10 ans y a-t-il une prime? il y a déjà beaucoup de réponses. y a-t-il quelque chose qui me manque ici?
Flaque d'

3
Ce gars n'a posé qu'une seule question et a quitté le site depuis. Je suppose que c'est tout ce qu'il a toujours voulu savoir ..: D
Nikos

Réponses:


484

Math.Floorarrondit vers le bas, Math.Ceilingarrondit vers le haut et Math.Truncatearrondit vers zéro. Ainsi, Math.Truncatec'est comme Math.Floorpour les nombres positifs et comme Math.Ceilingpour les nombres négatifs. Voici la référence .

Pour être complet, Math.Roundarrondit à l'entier le plus proche. Si le nombre est exactement à mi-chemin entre deux nombres entiers, alors il arrondit vers le pair. Référence.

Voir aussi: la réponse de Pax Diablo . Hautement recommandé!


31
@Chris, je vous suggère de corriger votre description de Round, il y a deux façons d'arrondir (AwayFromZero et ToEven) et il ne s'arrondit pas à l' entier le plus proche car il peut également effectuer un arrondi fractionnaire.
paxdiablo

1
Donc, juste un petit ajout à la question d'origine - quelle est la différence entre Math.Truncate et simplement un décimal ou un double en entier? ne serait-il pas également arrondi vers zéro?
Noam Gal

8
Quand (int)myDoublediffère- (int)Math.Truncate(myDouble)t-il?
mpen

2
À quoi (int) est-il égal en classe de mathématiques?
Lei Yang

386

Suivez ces liens pour les descriptions MSDN de:

  • Math.Floor, qui arrondit vers l'infini négatif.
  • Math.Ceiling, qui arrondit vers l'infini positif.
  • Math.Truncate, qui arrondit vers le haut ou vers le bas vers zéro.
  • Math.Round, qui arrondit à l'entier le plus proche ou au nombre spécifié de décimales. Vous pouvez spécifier le comportement s'il est exactement à égale distance entre deux possibilités, telles que l'arrondi de sorte que le dernier chiffre soit pair (" Round(2.5,MidpointRounding.ToEven)" devenant 2) ou qu'il soit plus éloigné de zéro (" Round(2.5,MidpointRounding.AwayFromZero)" devenant 3).

Le diagramme et le tableau suivants peuvent vous aider:

-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

Notez que Roundc'est beaucoup plus puissant qu'il n'y paraît, simplement parce qu'il peut arrondir à un nombre spécifique de décimales. Tous les autres arrondissent toujours à zéro décimale. Par exemple:

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

Avec les autres fonctions, vous devez utiliser la supercherie multiplier / diviser pour obtenir le même effet:

c = System.Math.Truncate (n * 100) / 100;                    // 3.14
d = System.Math.Ceiling (n * 100) / 100;                     // 3.15

7
Pax, je pense que vous avez une erreur avec: Round (AwayFromZero) -3 -2 1 2 3 Math.Round (-1.2, MidpointRounding.AwayFromZero) == -1 Math.Round (0.3, MidpointRounding.AwayFromZero) == 0,0 etc.
dtroy

1
Merci, @dtroy, je n'ai jamais eu besoin d'utiliser ce mode et, même si je l'ai documenté correctement si le texte, j'ai totalement mal compris les exemples. Espérons que ce soit corrigé maintenant.
paxdiablo

Désolé de commenter une question aussi ancienne, mais je dois vous demander: comment arrondir "ToEven" à deux décimales? Sûrement étrange et ne s'applique même qu'aux nombres entiers?
Richiban

4
@Richiban, pensez evencomme une propriété du dernier chiffre du nombre arrondi, et non comme signifiant que le nombre entier doit être un multiple de deux. Soit dit en passant, désolé qu'il ait fallu si longtemps pour vous répondre, j'espère que vous n'étiez pas simplement assis à attendre ma réponse :-)
paxdiablo

62

Math.Floor() arrondit vers l'infini négatif

Math.Truncate arrondit vers le haut ou vers le bas vers zéro.

Par exemple:

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

tandis que

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

2
Belle et simple explication avec un court exemple, cela devrait être marqué comme la réponse à cette question.
nivs1978

44

Quelques exemples:

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

29

Math.floorsliiiide à gauche ...
Math.ceilsliiiide à droite ...
Math.truncatecriiiiss crooooss (plancher / plafond toujours vers 0)
Math.roundcha cha, très lisse ... (aller du côté le plus proche)

Allons au travail! (⌐ □ _ □)

À gauche ... Math.floor
Reprenez maintenant, vous tous ... --
Deux sauts cette fois ...-=2

Tout le monde frappe des mains ✋✋

Jusqu'où pouvez-vous descendre? Pouvez-vous descendre bas? Jusqu'au floor?

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

Math.truncate(x)est également le même que int(x).
en supprimant une fraction positive ou négative, vous vous dirigez toujours vers 0.


HAHAHA joli remix.
Daniel dit Réintégrer Monica

26

Ils sont fonctionnellement équivalents avec des nombres positifs. La différence réside dans la façon dont ils traitent les nombres négatifs.

Par exemple:

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

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

Liens MSDN: - Méthode Math.Floor - Math.Floor Méthode Math.Truncate

PS Méfiez-vous des mathématiques, mais ce n'est peut-être pas ce que vous attendez.

Pour obtenir le résultat d'arrondi "standard", utilisez:

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

24

Essayez ceci, Exemples:

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

Aussi 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()

Renvoie le plus grand entier inférieur ou égal au nombre spécifié. MSDN system.math.floor

math.truncate()

Calcule la partie intégrale d'un nombre. MSDN system.math.truncate



15

Math.Floor(): Renvoie le plus grand entier inférieur ou égal au nombre à virgule flottante double précision spécifié.

Math.Round(): Arrondit une valeur à l'entier le plus proche ou au nombre spécifié de chiffres fractionnaires.


1
Le PO a demandé quelle était la différence entre Floor()et Truncate(), non Floor()et Round().
Robert Columbia

5

Math.floor()sera toujours arrondi vers le bas, c'est-à-dire qu'il renvoie moins d'entier. While round()renverra l'entier NEAREST

math.floor ()

Renvoie le plus grand entier inférieur ou égal au nombre spécifié.

math.truncate ()

Calcule la partie intégrale d'un nombre.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.