2017-05-08 1 views
0

Warum schreibt eine auf 1 Stelle gerundete Zahl immer noch mit vielen Ziffern nach Excel.Eine Variante abrunden

Zum Beispiel:

dim myvar as variant 
dim mysingle as single 
dim myrange as range 

mysingle = 4567.23494376 
myvar = round(mysingle,1) 

myrange = "A1" 
myrange.value = myvar 

Auch wenn ich myvar ich schreibe, die auf eine Stelle gerundet wurde Zelle A1, obwohl die Zelle 4567,2 zeigt, auf die Zelle klicken, zeigt den gesamten Wert mit allen Ziffern rechts von der Mantisse in der Formelleiste.

Sollte ich dieses Verhalten erwarten?

+0

Ja und Nein .. es hängt davon ab https://support.microsoft.com/en-us/help/214118/how-to-correc-rounding-errors-in-floating-point-arithmetic – Slai

+3

Dieser Code ist syntaktisch falsch. 'myrange =" A1 "' funktioniert nicht, während 'myrange' als' Range' 'DIM' ist. Und da 'Excel' Gleitkommazahlen in' Double'-Genauigkeit verwendet, sollten Sie 'Single' in VBA nicht für' Excel' verwenden. –

+0

Ja. Wenn Sie das Single '4567.2' in ein Double-Objekt umwandeln (so verwendet Excel Zahlen), lautet der Wert' 4567.2001953125', was Sie in der Zelle sehen. Sie können dies sehen mit: 'Debug.Print myvar, CDbl (myvar)' –

Antwort

4

Versuchen myvar = WorksheetFunction.Round(mysingle, 1)

statt myvar = round(mysingle,1)


Bitte beachten Sie auch die folgenden Informationen zur Verfügung gestellt sehen von @YowE3K

WorksheetFunction.Round gibt immer einen Wert vom Typ Variant/Double, während Round einen Wert zurückgibt vom gleichen Typ wie die input parameter (Single in diesem Fall).

+2

Sie können die Antwort bearbeiten möchten darauf hinweisen, dass 'WorksheetFunction.Round' gibt immer einen Wert von Geben Sie 'Variant/Double' ein, während' Round' einen Wert des gleichen Typs wie der Eingabeparameter (in diesem Fall 'Single') zurückgibt. – YowE3K

+0

Danke YowE3K, ich werde diese Informationen hinzufügen, um eine Erklärung zu geben. – Mertinc

1

Mit Single ist fast immer eine schlechte Idee - Excel verwendet Doubles - Einzel-, Doppel- Umwandlung führt zu Schwierigkeiten - dieser Code funktioniert, wie Sie für das Doppel erwarten, sondern gibt Ihre unerwartete Antwort mit einem einzigen ohne Runde Beteiligung

Sub roundit() 
Dim myvar As Variant 
Dim myDouble As Double 
Dim mySingle As Single 
myDouble = 4567.23494376 
mySingle = 4567.2 
myvar = Round(myDouble, 1) 

Range("a1").Value = myvar 
Range("a2").Value = mySingle 
End Sub 
+0

Danke Charles. Ich dachte, ich wäre schlau, wenn ich Singles benutze, um meine Erinnerung zu retten. – farmerandy