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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach einigem suchen scheint es, dass die VB hat keine saubere Art und Weise zu vollbringen, die, kurz zu schreiben, eine Erweiterung Methode.
C#
(int)
cast übersetzt direkt inconv.i4
im IL. VB hat keine solche Operatoren, und keine framework-Funktion scheint auch eine alternative.Usenet hatte eine interessante Diskussion über dieses zurück in 2005 – natürlich hat sich viel geändert seitdem, aber ich denke, das hält immer noch.
Können Sie die
Math.Truncate
Methode.Beispiel:
Math.Truncate
ergibt ein Ergebnis vom TypDouble
; die oben nicht kompilieren, ohneOption Strict Off
. DieInt
Funktion liefert dann die gewünschte numerische Verhalten, und wäre schön wenn ich das nutzen wollteOption Strict Off
, aber diese Einstellung macht vb.net eine sehr skurrile Sprache.Ich weiß, das ist ein Alter Fall, aber ich sah niemanden empfehlen, die Mathematik.Round () - Funktion.
Ja Mathe.Runde nimmt double und gibt ein double zurück. Aber es gibt eine Zahl, gerundet auf eine ganze Zahl. Es sollte einfach und prägnant umwandeln in einen integer mit cInt. Würde das ausreichen?
cInt(math.Runde(10000.54564)) ' = 10001
cInt(math.Runde(10000.49564)) ' = 10000
Müssen Sie möglicherweise extrahieren der Int Teil einer float-Zahl: