CInt rundet nicht den doppelten Wert - wie kann ich den Bruchteil entfernen?

8

Ich bin auf ein Problem mit CInt gestoßen und habe ein Double in eine ganze Zahl umgewandelt.

Das Problem ist das Folgende:

%Vor%

Ich habe mich an die C # -Stil-Konvertierung gewöhnt, wo (int) 10.51 10 ist.

Wie in der Frage zu Integer.Parse vs CInt hervorgehoben wurde, das Ergebnis ist nur auf gewisse Weise abgerundet.

Allerdings brauche ich nur einen ganzzahligen Teil und werfe den Bruchteil weg. Wie kann ich diese Art der Konvertierung in VB.NET erreichen? Nach einigen Recherchen sehe ich, dass ich die Funktion Fix() verwenden kann, um den Trick zu machen, aber ist es die beste Wahl?

    
nbulba 07.10.2011, 07:20
quelle

3 Antworten

8

Sie können Int oder Fix functions verwenden, aber der Rückgabewert dieser Funktionen ist doppelt, also müssen Sie ihn in Integer konvertieren, wenn option strict ist on .

%Vor%     
adatapost 07.10.2011, 08:31
quelle
4

Erstens ist Ihre Annahme, dass CInt äquivalent zu (int) in C # ist, falsch.

Zweitens, das Rundungsverhalten von CInt wird nicht zufällig zugewiesen - es verwendet tatsächlich "Bankers runding":

  

Bruchteile. Wenn Sie einen nicht integrierten Wert in ein Integral konvertieren   Typ, die Integer-Konvertierungsfunktionen (CByte, CInt, CLng, CSByte,   CShort, CUInt, CULng und CUShort) entfernen Sie den Bruchteil und   Runden Sie den Wert auf die nächste Ganzzahl.

     

Wenn der Bruchteil genau 0,5 ist, wird die ganzzahlige Umwandlung durchgeführt   Funktionen runden es auf die nächste gerade Ganzzahl . Zum Beispiel 0,5   Runden auf 0, und 1.5 und 2.5 beide Runde 2. Dies wird manchmal genannt   Banker's Rundung, und ihr Zweck ist es, eine Voreingenommenheit auszugleichen, die   könnte sich ansammeln, wenn man viele solcher Zahlen zusammenfügt.

Das beste Gegenstück zur Verwendung von (int) in C # ist die Funktion Fix im Namensraum VisualBasic , die auf Null abgerundet wird (wie Math.Truncate ).

Dies gibt jedoch einen doppelten Wert zurück, so dass Sie eine weitere Konvertierung durchführen müssen, um mit CInt zu Ihrer Ganzzahl zu gelangen.

%Vor%     
Matt Wilko 25.08.2015 11:59
quelle
1

Ich denke du kannst CInt(Math.Floor(10.51)) ausprobieren hoffe das hilft

    
Ginka 07.10.2011 08:02
quelle