Automatische Typ-Konvertierung in Visual Basic 6.0
Wenn wir konvertieren von float zu integer in visual basic 6.0, wie funktioniert es, Runden das gebrochene Teil? Ich bin talkin über die automatische Typ-Konvertierung.
Weisen wir wie
Dim i as Integer
i=5.5
msgbox i
Was wird es drucken? 5 oder 6 ??
War ich immer "5" ein paar Monate bevor. Eines Tages begann es, dass Sie mir 6!
Jede Idee, whats goin falsch? Hat microsoft einige patches veröffentlicht, um etwas zu beheben?
Update : 5.5 wird umgewandelt, um 6 aber von 8,5 auf 8 !
Update 2 : Hinzufügen von CInt, macht keinen Unterschied. CInt(5.5) ergibt 6 und Cint(8.5) gibt 8!! Ein bisschen weired Verhalten. Ich sollte versuchen, so etwas wie floor(x + 0.49);
- Aufhören zu sagen, "gewirkt". Dies ist nicht type-casting an alle, es ist Typ-Konvertierung. Es ist ein großer Unterschied.
- Mein schlechtes. Danke für die Korrektur bro
- Tuxist, so sollten Sie Bearbeiten Ihre Frage, und ändern Sie "cast" und "casting" zu "bekehren" und "Bekehrung".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Teil von diesem ist in der VB6-Hilfe: Thema Typkonvertierung Funktionen. Es ist leider eines der Themen, die nicht in der VB6-Dokumentation auf der MSDN-website, aber wenn Sie installiert haben, die helfen, mit VB6, wird es da sein.
Implizite Typumwandlung - ein.k.ein. "böse Typumwandlung (PDF)" - von einer Gleitkommazahl zu einer ganzen Zahl verwendet dieselben Rundungsregeln wie CInt und CLng. Dieses Verhalten scheint nicht zu sein dokumentiert irgendwo in der Anleitung.
Wenn Sie möchten, round up, wenn der gebrochene Teil ist >= 0.5, und unten, sonst einen einfachen Weg, es zu tun ist
Und aus der Spitze von meine Kopf, hier ist meine kürzere version von Mike Spross ist RoundNumber🙂 das ist ein Ersatz für die VB6 Funktion Runden.
Beispiel-Ausgabe:
RoundNumber
Sie zuerst multiplizieren, dann dividieren:RoundNumber = Int(0.5 + value * nMultiplier) / CDbl(nMultiplier)
nicht die andere Weise herum. Lustigste Teil istInt
Funktion tatsächlich gibt eineDouble
in diesem (retval ist vom gleichen Typ wie param) so ist das arbeiten mit großen zahlen/großer Genauigkeit zu. WahrscheinlichCDec(0.5) + ...
erhöhen die Präzision deutlich zu.Update: Nach etwas googlen kam ich auf die folgenden Artikel:
Dies erklärt die (scheinbare) komisch Verhalten:
Alt Update:
Vielleicht solltest du etwas präziser werden: verwenden Sie
CInt
, anstatt einfach die Zuweisung eines float zu einem integer. E. g:Das veränderte Verhalten klingt in der Tat besorgniserregend, aber die richtige Antwort surley ist 6. Blättern Sie nach unten, um "Runde, um selbst Methode" auf Wikipedia, Rundung für eine Erklärung.
Als andere haben bereits darauf hingewiesen, daß die "seltsame Verhalten", die Sie sehen, aufgrund der Tatsache, dass VB6 verwendet Banker ' s Rounding beim Runden Bruchzahlen.
Dass ist auch normal.
CInt
immer Runden (wieder mit dem Banker ' s Rounding-Methode), bevor Sie die Konvertierung.Wenn Sie eine Zahl mit einem Bruch-Teil und wollen einfach abschneiden, Sie (ignorieren Sie den Teil nach dem Komma) verwenden, können Sie entweder die
Fix
oder dieInt
Funktion:Int
funktioniert auf die gleiche Weise wieFix
, außer der Tatsache, dass es Runden, die negativen zahlen nach unten auf den nächsten, der kleinsten negativen Zahl:Wenn Sie wirklich wollen, um Runde eine Zahl entsprechend der Regeln, die die meisten Menschen vertraut sind, haben Sie, um deine eigene Funktion schreiben, um es zu tun. Unten ist ein Beispiel der Rundung, das wird aufgerundet, wenn der Bruchteil größer oder gleich .5, und Runde nach unten; ansonsten:
BEARBEITEN: Sehen MarkJ Antwort für eine viel einfachere (und wahrscheinlich schnellere) version dieser Funktion.
Beispiele
Die VB6-Funktion Round() verwendet eine Banker ' s Rounding Methode. MS KB-Artikel 225330 (http://support.microsoft.com/kb/225330) spricht über diese indirekt durch den Vergleich von VBA in Office 2000 in Excel native Verhalten und beschreibt es so:
Wenn Sie müssen anders Verhalten, ich fürchte, du musst zu geben, es selbst.