Qual è la differenza tra Math.Floor()
e Math.Truncate()
in .NET?
Qual è la differenza tra Math.Floor()
e Math.Truncate()
in .NET?
Risposte:
Math.Floor
arrotonda, Math.Ceiling
arrotonda e Math.Truncate
arrotonda verso lo zero. Quindi, Math.Truncate
è come Math.Floor
per i numeri positivi e come Math.Ceiling
per i numeri negativi. Ecco il riferimento .
Per completezza, Math.Round
arrotonda al numero intero più vicino. Se il numero è esattamente a metà strada tra due numeri interi, si arrotonda verso quello pari. Riferimento.
Vedi anche: la risposta di Pax Diablo . Altamente raccomandato!
(int)myDouble
differisce da (int)Math.Truncate(myDouble)
?
Segui questi collegamenti per le descrizioni MSDN di:
Math.Floor
, che si arrotonda verso l'infinito negativo.Math.Ceiling
, che arrotonda verso l'infinito positivo.Math.Truncate
, che arrotonda per eccesso o per difetto verso zero.Math.Round
, che viene arrotondato al numero intero più vicino o al numero specificato di posizioni decimali. È possibile specificare il comportamento se è esattamente equidistante tra due possibilità, come arrotondare in modo che la cifra finale sia pari (" Round(2.5,MidpointRounding.ToEven)
" diventando 2) o in modo che sia più lontana da zero (" Round(2.5,MidpointRounding.AwayFromZero)
" diventando 3).Il diagramma e la tabella seguenti possono essere d'aiuto:
-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
Nota che Round
è molto più potente di quanto sembri, semplicemente perché può arrotondare a un numero specifico di cifre decimali. Tutti gli altri arrotondano sempre a zero decimali sempre. Per esempio:
n = 3.145;
a = System.Math.Round (n, 2, MidpointRounding.ToEven); // 3.14
b = System.Math.Round (n, 2, MidpointRounding.AwayFromZero); // 3.15
Con le altre funzioni, devi usare l'inganno moltiplicare / dividere per ottenere lo stesso effetto:
c = System.Math.Truncate (n * 100) / 100; // 3.14
d = System.Math.Ceiling (n * 100) / 100; // 3.15
even
come una proprietà della cifra finale nel numero arrotondato, non nel senso che l'intero numero deve essere un multiplo di due. A proposito, mi dispiace che ci sia voluto così tanto tempo per tornare da te, spero che tu non fossi solo seduto in attesa della mia risposta :-)
Math.Floor()
arrotonda verso l'infinito negativo
Math.Truncate
arrotonda per eccesso o per difetto verso zero.
Per esempio:
Math.Floor(-3.4) = -4
Math.Truncate(-3.4) = -3
mentre
Math.Floor(3.4) = 3
Math.Truncate(3.4) = 3
Qualche esempio:
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
Math.floor
sliiiide a sinistra ...
Math.ceil
sliiiide a destra ...
Math.truncate
criiiiss crooooss (pavimento / soffitto sempre verso 0)
Math.round
cha cha, real smooth ... (vai al lato più vicino)
Andiamo a lavorare! (⌐ □ □ _)
A sinistra ... Math.floor
Riprendilo ora tutti ... --
Due salti questa volta ...-=2
Tutti battono le mani ✋✋
Quanto in basso si può andare? Puoi scendere in basso? Fino al floor
?
if (this == "wrong")
return "i don't wanna be right";
Math.truncate(x)
è anche lo stesso di int(x)
.
rimuovendo una frazione positiva o negativa, vai sempre verso 0.
Sono funzionalmente equivalenti con numeri positivi. La differenza sta nel modo in cui gestiscono i numeri negativi.
Per esempio:
Math.Floor(2.5) = 2
Math.Truncate(2.5) = 2
Math.Floor(-2.5) = -3
Math.Truncate(-2.5) = -2
Collegamenti MSDN: - Metodo Math.Floor - Metodo Math.Truncate
PS: fai attenzione alla matematica, perché potrebbe non essere quello che ti aspetti.
Per ottenere il risultato di arrotondamento "standard" utilizzare:
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
Prova questo, esempi:
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
Anche 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()
Restituisce il numero intero più grande minore o uguale al numero specificato. MSDN system.math.floor
math.truncate()
Calcola la parte integrale di un numero. MSDN system.math.truncate
Math.Floor()
arrotonda "verso l'infinito negativo" in conformità allo standard IEEE 754 sezione 4.
Math.Truncate()
arrotonda "al numero intero più vicino verso zero".
Math.Floor()
: Restituisce il numero intero più grande minore o uguale al numero in virgola mobile a precisione doppia specificato.
Math.Round()
: Arrotonda un valore all'intero più vicino o al numero specificato di cifre frazionarie.
Floor()
e Truncate()
, non Floor()
e Round()
.
Troncare rilascia il decimale ****