Sauberste Weg, um konvertieren von einem `Doppel - ` oder `Single` auf `Integer`, ohne Rundung

Konvertierung einer Gleitkommazahl in eine ganze Zahl entweder CInt oder CType verursachen wird, der Wert, die Zahl gerundet werden soll. Die Int Funktion und Math.Floor kann verwendet werden, zum konvertieren einer Gleitkommazahl in eine ganze Zahl und Rundung in Richtung negativ unendlich, aber beide Funktionen geben die floating-point-Werte, die nicht implizit als Integer Werte ohne cast.

Ist es eine präzise und idiomatische alternative zu IntVar = CInt(Int(FloatingPointVar));? Pascal enthalten Round und Trunc Funktionen, die zurückgegeben Integer; gibt es eine Entsprechung in entweder der VB.NET Sprache oder in der .NET framework?

Einer ähnlichen Frage, CInt funktioniert nicht Runde Double-Wert konsequent - wie kann ich die entfernen Sie das gebrochene Teil? wurde gebeten, im Jahr 2011, aber es ist einfach gefragt, ob es eine Möglichkeit zur Konvertierung einer Gleitkommazahl in eine ganze Zahl; die Antworten vorgeschlagen, eine zwei-Schritt-Prozess, aber es nicht in beliebiger Tiefe über das, was existiert oder existiert nicht in den Rahmen. Ich würde es schwer finden zu glauben, dass der Rahmen hätte nicht etwas Analog zu der Pascal Trunc Funktion, dass diese eine Sache wird Häufig erforderlich sein, wenn die Durchführung grafischen Operationen mit Gleitkomma-Operanden [solche Operationen müssen gerendert werden als einzelne Pixel, und sollte abgerundet sein, so dass round(x)-1 = round(x-1) für alle x, die passen in den Bereich von +/- (2^31-1); selbst wenn solche Operationen sind gerundet, sollten Sie Floor(x+0.5), sondern als round-to-nearest-even, um sicherzustellen, dass die oben genannten Eigenschaft]

Übrigens in C# eine Typumwandlung von Double zu Int mit (type)expr - notation verwendet round-to-zero-Semantik; die Tatsache, dass dies unterscheidet sich von der VB.NET das Verhalten deutet darauf hin, dass eine oder beide Sprachen eine eigene Konvertierungsroutinen eher eine explizite Konvertierung operator enthalten, in den Rahmen. Es scheint wahrscheinlich, dass der Rahmen sollte definieren Sie ein conversion operator? Solch ein operator existiert im Rahmen? Was tut es? Gibt es eine Möglichkeit zum aufrufen von C# und/oder VB.NET?

  • Nicht beantworten Ihre Frage, nur als ein Punkt der Neugier: Convert.ToInt32 verwendet noch ein anderes rundungsverfahren, nämlich für die bankübliche Rundung.
  • Danke für das Angebot, die als conversion-Methode; es ist leider die gleiche Methode, die von CInt, obwohl für code in C# geschrieben, könnte es hilfreich sein.
  • Ah, dachte ich (ohne überprüfung), dass CInt hast, round-to-zero, eher als abschneiden oder das rund-um-zum-selbst. Jedenfalls, wie ich sagte, es ist nicht eine Antwort. Ich kann mir nicht vorstellen, dass es eine Methode zum erreichen von C#'s (int) cast in einem Schritt in VB (was nicht heißt, dass es keine Möglichkeit gibt).
  • Eigentlich ist das, was ich möchte, wäre die Runde-zu-negativ-unendlich. Grafische Routinen, round-to-zero haben oft eine sichtbare Anomalie bei null, und die rund-um-sogar manchmal Anomalien alle zwei Pixel (da die Sequenz (0.5 1.5 2.5 3.5), wenn abgerundet wird (0 2 2 4). Runde-auf-negative-infinity ist eindeutig nützlich in vielen Szenarien; ich Frage mich, ob die verschiedenen Grafik-Routinen verwenden Sie Ihren eigenen internen Methoden, oder was Sie tun?
InformationsquelleAutor supercat | 2013-02-04
Schreibe einen Kommentar