Unterschied zwischen Math.Floor () und Math.Truncate ()


422

Was ist der Unterschied zwischen Math.Floor()und Math.Truncate()in .NET?


8
zB Math.Floor (5.4) = 5 Math.Truncate (5.4) = 5
Subramani

3
brauchst du das wirklich nach 10 Jahren ungerade? lol
L_Church

1
Warum gibt es nach 10 Jahren ein Kopfgeld? Es gibt bereits viele Antworten. Fehlt mir hier etwas?
Pfütze

3
Dieser Typ hat nur eine Frage gestellt und die Seite seitdem verlassen. Ich denke, das ist alles, was er schon immer wissen wollte ..: D
Nikos

Antworten:


483

Math.Floorrundet ab, Math.Ceilingrundet auf und Math.Truncaterundet gegen Null. Also Math.Truncateist wie Math.Floorfür positive Zahlen und wie Math.Ceilingfür negative Zahlen. Hier ist die Referenz .

Der Vollständigkeit Math.Roundhalber wird auf die nächste Ganzzahl gerundet. Wenn die Zahl genau in der Mitte zwischen zwei ganzen Zahlen liegt, rundet sie auf die gerade Zahl. Referenz.

Siehe auch: Pax Diablos Antwort . Sehr empfehlenswert!


31
@Chris, ich schlage vor, Sie korrigieren Ihre Beschreibung von Round. Es gibt zwei Möglichkeiten zum Runden (AwayFromZero und ToEven) und es wird nicht auf die nächste Ganzzahl gerundet, da es auch fraktionierte Rundungen durchführen kann.
Paxdiablo

1
Also nur eine kurze Ergänzung zur ursprünglichen Frage - was ist der Unterschied zwischen Math.Truncate und dem Umwandeln einer Dezimalzahl oder eines Doppels in int? würde es nicht auch nur gegen null runden?
Noam Gal

8
Wann unterscheidet (int)myDoublesich von (int)Math.Truncate(myDouble)?
Mpen

2
Was ist (int) gleich im Matheunterricht?
Lei Yang

386

Folgen Sie diesen Links für die MSDN-Beschreibungen von:

  • Math.Floor, die in Richtung negative Unendlichkeit abrundet.
  • Math.Ceiling, was sich in Richtung positive Unendlichkeit aufrundet.
  • Math.Truncate, die gegen Null auf- oder abrundet.
  • Math.Round, die auf die nächste Ganzzahl oder die angegebene Anzahl von Dezimalstellen rundet. Sie können das Verhalten angeben, wenn es zwischen zwei Möglichkeiten genau gleich weit entfernt ist, z. B. gerundet, damit die letzte Ziffer gerade ist (" Round(2.5,MidpointRounding.ToEven)" 2 wird) oder weiter von Null entfernt ist (" Round(2.5,MidpointRounding.AwayFromZero)" 3 wird).

Das folgende Diagramm und die folgende Tabelle können hilfreich sein:

-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

Beachten Sie, dass dies Roundviel leistungsfähiger ist, als es scheint, einfach weil es auf eine bestimmte Anzahl von Dezimalstellen gerundet werden kann. Alle anderen runden immer auf null Dezimalstellen. Zum Beispiel:

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

Bei den anderen Funktionen müssen Sie Multiplikations- / Divisions-Tricks verwenden, um den gleichen Effekt zu erzielen:

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

7
Pax, ich denke du hast einen Fehler mit: 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
Danke, @dtroy, ich hatte nie die Notwendigkeit, diesen Modus zu verwenden, und obwohl ich ihn korrekt dokumentiert habe, wenn der Text, habe ich die Beispiele völlig falsch verstanden. Hoffentlich ist das jetzt behoben.
Paxdiablo

Es tut mir leid, eine so alte Frage zu kommentieren, aber ich muss fragen: Wie kann man "ToEven" auf zwei Dezimalstellen runden? Sicherlich seltsam und gerade nur für ganze Zahlen?
Richiban

4
@Richiban, stellen Sie sich eveneine Eigenschaft der letzten Ziffer in der gerundeten Zahl vor, nicht, dass die gesamte Zahl ein Vielfaches von zwei sein muss. Übrigens, tut mir leid, es hat so lange
gedauert,

62

Math.Floor() Runden in Richtung negative Unendlichkeit

Math.Truncate rundet auf oder ab gegen Null.

Zum Beispiel:

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

während

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

2
Schöne und einfache Erklärung mit einem kurzen Beispiel, dies sollte als Antwort auf diese Frage markiert werden.
nivs1978

44

Einige Beispiele:

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 nach links ...
Math.ceilSliiiide nach rechts ...
Math.truncateCriiiiss Crooooss (Boden / Decke immer in Richtung 0)
Math.round cha cha, echt glatt ... (zur nächsten Seite gehen)

Gehen wir an die Arbeit! (⌐ □ _ □)

Links ... Math.floor
Nimm es jetzt zurück, ihr alle ... --
Diesmal zwei Sprünge ...-=2

Alle klatschen in die Hände ✋✋

Wie tief kann man gehen? Kannst du tief runter gehen? Den ganzen Weg zum floor?

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

Math.truncate(x)ist auch das gleiche wie int(x).
Wenn Sie einen positiven oder negativen Bruch entfernen, bewegen Sie sich immer in Richtung 0.


HAHAHA schöner Remix.
Daniel sagt Reinstate Monica

26

Sie sind funktional äquivalent zu positiven Zahlen. Der Unterschied besteht darin, wie sie mit negativen Zahlen umgehen.

Zum Beispiel:

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

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

MSDN-Links: - Math.Floor-Methode - Math.Truncate-Methode

PS Vorsicht vor Mathe. Runde ist möglicherweise nicht das, was Sie erwarten.

Um das "Standard" -Rundungsergebnis zu erhalten, verwenden Sie:

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

Versuchen Sie dies, Beispiele:

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

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

Gibt die größte Ganzzahl zurück, die kleiner oder gleich der angegebenen Zahl ist. MSDN system.math.floor

math.truncate()

Berechnet den integralen Teil einer Zahl. MSDN system.math.truncate



15

Math.Floor(): Gibt die größte Ganzzahl zurück, die kleiner oder gleich der angegebenen Gleitkommazahl mit doppelter Genauigkeit ist.

Math.Round(): Rundet einen Wert auf die nächste Ganzzahl oder auf die angegebene Anzahl von Bruchstellen.


1
Das OP fragte nach dem Unterschied zwischen Floor()und Truncate(), nicht Floor()und Round().
Robert Columbia

5

Math.floor()wird immer abrunden, dh es wird WENIGER Ganzzahl zurückgegeben. While round()gibt die NEAREST-Ganzzahl zurück

math.floor ()

Gibt die größte Ganzzahl zurück, die kleiner oder gleich der angegebenen Zahl ist.

math.truncate ()

Berechnet den integralen Teil einer Zahl.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.