2008-08-01 10 views

Antwort

419

Math.Floor rundet ab, Math.Ceiling rundet auf, und Math.Truncate rundet auf Null ab. So ist Math.Truncate wie Math.Floor für positive Zahlen und wie Math.Ceiling für negative Zahlen. Hier ist die reference.

Der Vollständigkeit halber wird Math.Round auf die nächste Ganzzahl gerundet. Wenn die Zahl genau in der Mitte zwischen zwei ganzen Zahlen liegt, dann wird auf die gerade Zahl gerundet. Reference.

Siehe auch: Pax Diablo's answer. Sehr empfehlenswert!

+25

@Chris, ich schlage vor, dass Sie Ihre Beschreibung von Runde korrigieren, es gibt zwei Möglichkeiten zum Runden (AwayFromZero und ToEven) und es wird nicht auf die nächste * Ganzzahl * gerundet, da es auch eine Teilrundung ausführen kann. – paxdiablo

+1

Also nur eine kurze Ergänzung zu der ursprünglichen Frage - Was ist der Unterschied zwischen Math.Truncate und nur eine Dezimal oder Doppel zu int zu werfen? würde es nicht auch gleich gegen Null gehen? –

+6

Wann unterscheidet sich '(int) myDouble' von' (int) Math.Truncate (myDouble) '? – mpen

36

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 
343

Führen Sie die folgenden Links für die MSDN-Beschreibungen:

  • Math.Floor, die nach unten in Richtung der negativen Unendlichkeit rundet.
  • Math.Ceiling, die rundet auf positive Unendlichkeit.
  • Math.Truncate, die auf Null oder auf rund abrundet.
  • Math.Round, die auf die nächste Ganzzahl oder die angegebene Anzahl von Dezimalstellen rundet. Sie können das Verhalten angeben, wenn es genau zwischen zwei Möglichkeiten äquidistant ist, z. B. Runden, so dass die letzte Ziffer gerade ist ("Round(2.5,MidpointRounding.ToEven)" wird 2) oder es ist weiter von Null entfernt ("Round(2.5,MidpointRounding.AwayFromZero)" wird 3).

Das folgende Diagramm und Tabelle kann helfen:

-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 Round viel stärker ist, als es scheint, einfach weil es auf eine bestimmte Anzahl von Dezimalstellen abzurunden können. 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 die gleiche Wirkung zu erzielen:

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

Pax, ich glaube du hast einen Fehler mit: Runde (AwayFromZero) -3 -2 1 2 3 Math.Round (-1.2, MittelpunktRounding.AwayFromZero) == -1 Math.Round (0.3, MidpointRounding .AwayFromZero) == 0.0 etc .. – dtroy

+0

Danke, @dtroy, ich hatte nie eine Notwendigkeit, diesen Modus zu verwenden, und während ich es richtig dokumentierte, wenn der Text, habe ich völlig die Beispiele falsch. Hoffentlich ist das jetzt behoben. – paxdiablo

+0

Entschuldigen Sie die Frage zu einer so alten Frage, aber ich muss fragen: Wie können Sie "ToEven" auf zwei Dezimalstellen runden? Sicher ungerade und sogar nur für ganze Zahlen gelten? – Richiban

36

Math.Floor() Runden gegen minus unendlich

Math.Truncate Runden nach oben oder unten 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 
10

Math.Floor(): Liefert die größte ganze Zahl kleiner als oder gleich dem angegebenen doppelter Genauigkeit Gleitkommazahl

Math.Round(). A. Wert auf die nächste ganze Zahl Runden oder auf die angegebene Anzahl der Nachkommastellen

+0

Das OP fragte nach dem Unterschied zwischen 'Floor()' und 'Truncate()', nicht 'Floor()' und 'Round()'. –

17

sie sind funktionell gleichwertig mit positiven Zahlen Der Unterschied in der ist, wie sie negative Zahlen verarbeiten

. 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 Method - Math.Truncate Method

P. S. Vorsicht vor Mathe. Es ist vielleicht nicht das, was Sie erwarten.

Um den "Standard" Rundungsergebnis Verwendung zu erhalten:

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 
11

math.floor()

Gibt die größte ganze Zahl kleiner oder gleich der angegebenen Zahl.

MSDN system.math.floor

math.truncate()

Berechnet den integralen Bestandteil einer Zahl.

MSDN system.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 

Zusätzlich 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 
1

Math.floor sliiiide nach links ...
Math.ceil sliiiide nach rechts ...
Math.truncate criiiiss crooooss (Boden/Decke immer in Richtung 0)
Math.round cha cha, echt glatt ... (zur nächsten Seite gehen)

Los geht's zur Arbeit! (⌐ □ _ □)

Auf der linken Seite ... Math.floor
es jetzt Rücknahme- y'all ... --
Zwei Hopfen diesmal ... -=2

Jeder Hände klatschen ✋✋

Wie niedrig können Sie gehen? Kannst du runter gehen? Den ganzen Weg bis zur floor?

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

Math.truncate(x) ist auch die gleiche wie int(x).
durch Entfernen einer positiven oder negativen Fraktion, gehen Sie immer in Richtung 0.