Antworten:
Verwendung Math.round()
, möglicherweise in Verbindung mitMidpointRounding.AwayFromZero
z.B:
Math.Round(1.2) ==> 1
Math.Round(1.5) ==> 2
Math.Round(2.5) ==> 2
Math.Round(2.5, MidpointRounding.AwayFromZero) ==> 3
double d = 1.234;
int i = Convert.ToInt32(d);
Griffe wie folgt abrunden:
auf die nächste 32-Bit-Ganzzahl mit Vorzeichen gerundet. Wenn der Wert auf halbem Weg zwischen zwei ganzen Zahlen liegt, wird die gerade Zahl zurückgegeben. Das heißt, 4,5 wird in 4 und 5,5 in 6 konvertiert.
Math.Round
da es bei Bedarf ein int zurückgibt.
[0,.5)
- ab und genau die Hälfte der Zahlen - [.5,1)
- auf. Durch das Runden auf gerade gerade werden gerade Zahlen verzerrt, da es (.5,1.5)
auf 1, aber [1.5,2.5]
auf 2
Sie können auch die Funktion verwenden:
//Works with negative numbers now
static int MyRound(double d) {
if (d < 0) {
return (int)(d - 0.5);
}
return (int)(d + 0.5);
}
Je nach Architektur ist es um ein Vielfaches schneller.
double d;
int rounded = (int)Math.Round(d);
Ich weiß, dass diese Frage alt ist, aber ich bin auf meiner Suche nach der Antwort auf meine ähnliche Frage darauf gestoßen. Ich dachte, ich würde den sehr nützlichen Tipp teilen, den ich bekommen habe.
Wenn Sie in int konvertieren, erhöhen Sie einfach .5
Ihren Wert, bevor Sie das Downcasting durchführen. Da Downcasting int
immer auf die niedrigere Zahl fällt (z. B. (int)1.7 == 1
), wenn Ihre Nummer .5
oder höher ist, .5
wird sie durch Hinzufügen in die nächste Zahl aufgenommen, und Ihr Downcasting int
sollte den richtigen Wert zurückgeben. (zB (int)(1.8 + .5) == 2
)
+ 0.5 * Math.Abs(d)
Methoden in anderen Antworten werfen, OverflowException
wenn der Gleitkommawert außerhalb des Int-Bereichs liegt. https://docs.microsoft.com/en-us/dotnet/api/system.convert.toint32?view=netframework-4.8#System_Convert_ToInt32_System_Single_
int result = 0;
try {
result = Convert.ToInt32(value);
}
catch (OverflowException) {
if (value > 0) result = int.MaxValue;
else result = int.Minvalue;
}
Verwenden Sie für Unity Mathf.RoundToInt .
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
void Start()
{
// Prints 10
Debug.Log(Mathf.RoundToInt(10.0f));
// Prints 10
Debug.Log(Mathf.RoundToInt(10.2f));
// Prints 11
Debug.Log(Mathf.RoundToInt(10.7f));
// Prints 10
Debug.Log(Mathf.RoundToInt(10.5f));
// Prints 12
Debug.Log(Mathf.RoundToInt(11.5f));
// Prints -10
Debug.Log(Mathf.RoundToInt(-10.0f));
// Prints -10
Debug.Log(Mathf.RoundToInt(-10.2f));
// Prints -11
Debug.Log(Mathf.RoundToInt(-10.7f));
// Prints -10
Debug.Log(Mathf.RoundToInt(-10.5f));
// Prints -12
Debug.Log(Mathf.RoundToInt(-11.5f));
}
}
public static int RoundToInt(float f) { return (int)Math.Round(f); }
Ich entwickle einen wissenschaftlichen Taschenrechner mit einer Int-Taste. Ich habe festgestellt, dass Folgendes eine einfache, zuverlässige Lösung ist:
double dblInteger;
if( dblNumber < 0 )
dblInteger = Math.Ceiling(dblNumber);
else
dblInteger = Math.Floor(dblNumber);
Math.Round führt manchmal zu unerwarteten oder unerwünschten Ergebnissen, und die explizite Konvertierung in eine Ganzzahl (über cast oder Convert.ToInt ...) führt häufig zu falschen Werten für Zahlen mit höherer Genauigkeit. Die obige Methode scheint immer zu funktionieren.
Convert.ToInt32()
das Gleiche getan oder wird einfach alles nach der Dezimalstelle entfernt?