Wie kann ich ein Double in den nächsten ganzzahligen Wert konvertieren?

147

Wie konvertiert man ein Double in das nächste Int?

Leora
quelle

Antworten:

78

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
nickf
quelle
6
Wird nicht Convert.ToInt32()das Gleiche getan oder wird einfach alles nach der Dezimalstelle entfernt?
Der Muffin-Mann
208
Erzeugt eigentlich keine ganze Zahl, sondern ein Doppel.
Gatopeich
13
@Ronnie - nein, das ist beabsichtigt. Standardmäßig rundet Math.Round Mittelpunktszahlen (x + .5) auf die nächste gerade Zahl. Wenn Sie ein anderes Verhalten wünschen, müssen Sie es über ein Flag angeben. msdn.microsoft.com/en-us/library/system.midpointrounding.aspx
nickf
6
Nun, ich nie! :)
Ronnie
5
Double ist nicht Int.
Evgeni Nabokov
267
double d = 1.234;
int i = Convert.ToInt32(d);

Referenz

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.

John Sheehan
quelle
7
Viel besser, Math.Roundda es bei Bedarf ein int zurückgibt.
Keith
10
@ Robert-Koritnik. Ich bin mir nicht sicher, warum das "ungültig" ist. OP hat keine bevorzugte Rundungsregel angegeben, und "Runde .5 auf die nächste Gerade" ist die Standardregel von früher. Immer aufrunden hat unerwünschte statistische Auswirkungen.
Keith
@Keith: Ich weiß es nicht, aber mir wurde immer beigebracht, x.5 aufzurunden , aber ich kann Gründe sehen, es für Statistiken nach oben oder unten zu tun. Dank dafür. PS Es ist klar, dass ich nicht in Statistik, Finanzen oder Buchhaltung tätig bin, wo diese Art der Rundung standardmäßig zu sein scheint .
Robert Koritnik
3
"Immer aufrunden hat unerwünschte statistische Auswirkungen" - Das ist einfach falsch. Rundung .5 hoch rundet genau die Hälfte der Zahlen - [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
gerundet wird
11
@JimBalter Da Null nicht gerundet ist, führt das Aufrunden der Hälfte zu einer positiven Vorspannung, was als asymmetrische Rundung bezeichnet wird. Die "runde Hälfte bis gerade" funktioniert nicht, wenn Ihre Verteilung gerade genug ist und die Rundung weder gerade noch ungerade Zahlen beeinflusst. Siehe auf halbem Weg das Brechen der Krawatte .
sdds
36

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.

szymcio
quelle
Das war perfekt für mich, da Math.Round nicht so funktionierte, wie ich es wollte.
Hanna
@cullub ja das tut es. Es konvertiert das doppelte d, an das 0,5 angehängt wurde, in eine ganze Zahl.
Darrell
Dies ist meine bevorzugte Methode - funktioniert auf sehr einfache Weise. So viel kürzer und einfacher zu lesen als Math.Round (d, MidpointRounding.AwayFromZero) und prägnanter als die Verwendung einer if-Anweisung, um zu entscheiden, ob abgerundet oder aufgerundet werden soll. UND, gibt tatsächlich eine ganze Zahl am Ende, nicht den doppelten
binderbound
3
Siehe @ Eternal21s Kommentar unten für ungerades Verhalten bei negativen Zahlen (MyRound (-1.2) = 0)
Chris
2
Für alle, die sich fragen, wird das von @Chris erwähnte Problem jetzt vermutlich gelöst, indem überprüft wird, ob der Wert negativ ist.
John Weisz
14
double d;
int rounded = (int)Math.Round(d);

quelle
5

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 .5Ihren Wert, bevor Sie das Downcasting durchführen. Da Downcasting intimmer auf die niedrigere Zahl fällt (z. B. (int)1.7 == 1), wenn Ihre Nummer .5oder höher ist, .5wird sie durch Hinzufügen in die nächste Zahl aufgenommen, und Ihr Downcasting intsollte den richtigen Wert zurückgeben. (zB (int)(1.8 + .5) == 2)

Trent
quelle
13
Das Problem ist, wenn Sie versuchen, negative Werte auf diese Weise zu konvertieren. Zum Beispiel wird -1,25 gleich 0 sein (-1,25 + 0,5 = 0,75, und sobald es auf int herabgesetzt ist, ist es 0). Sie müssen also 0,5 von negativen Werten abziehen.
Eternal21
Man kann verwenden+ 0.5 * Math.Abs(d)
TaW
-1

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));
    }
}

Quelle

public static int RoundToInt(float f) { return (int)Math.Round(f); }
zwcloud
quelle
Q erwähnt oder markiert Unity nicht.
XenoRo
@ XenoRo Ich habe diese alte Frage für diejenigen beantwortet, die nach ähnlichen Antworten suchen, wenn sie Unity verwenden.
Zwcloud
2
Sie können Ihre eigenen Fragen zum Wissensaustausch beantworten. Erstellen Sie in solchen Fällen eine separate API-spezifische Frage (in diesem Fall Unity). Die Antworten sollten auf die Fragen zutreffen. Andernfalls könnte hier für jede einzelne C # -API mit Rundungsfunktion eine Antwort gefunden werden.
XenoRo
-2

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.

Mark Jones
quelle
2
Rundet dies nicht alle negativen und alle positiven Zahlen auf? Das ist nicht unbedingt die "neaerest" ganze Zahl.
Tim Pohlmann
Dies ist nicht die nächste Nummer.
Samer Aamar
1
Bei 1,99 ergibt dies 1,0.
Jon Schneider