Neugieriges Verhalten von Access.Application.Eval ()

8

Erklären Sie, warum Access.Application.Eval() (häufig abgekürzt als Eval() ) ein anderes Ergebnis liefert als nur den ursprünglichen Ausdruck in diesem Fall zu bewerten:

%Vor%

EDIT: Um GSergs Antwort zu beantworten, gibt das folgende noch verschiedene Ergebnisse zurück:

%Vor%     
mwolfe02 22.06.2011, 13:46
quelle

5 Antworten

6

Diese Multiplikation gibt ein anderes Produkt unter Eval () zurück, aber ich verstehe nicht warum.

%Vor%

Im ersten Fall ist das Produkt kleiner als 57,5, also wird Round () auf 57 abgerundet.

Im zweiten Fall ist das Produkt gleich 57,5, also wird Round () seinen Standard-Ansatz "round to even" anwenden, um 58 zu ergeben.

Bearbeiten : Sie haben alle Recht damit, dass Eval () den Literalwert in einen anderen Datentyp konvertiert.

%Vor%     
HansUp 22.06.2011, 15:13
quelle
4

Das liegt an der unterschiedlichen Float-Genauigkeit.

In einem Fall werden die Konstanten als Double s erkannt, in der anderen als Single s.

%Vor%     
GSerg 22.06.2011 13:58
quelle
2

GSerg hat mich nachdenklich gemacht. Ich fange an zu glauben, dass Jet versucht, Dezimal-Literale beim Aufruf von Eval zum Currency-Typ zu zwingen, während VBA Dezimal-Literale in den Double-Typ umwandelt. Ein typischer Fall:

%Vor%     
mwolfe02 22.06.2011 15:14
quelle
1

Ich benutze Access nicht, aber ich würde vermuten, dass das Eval den Ausdruck als Access-Ausdruck auswertet, so dass die Funktionen Round und Int anders funktionieren als die VBA-Versionen?

Ich weiß aus bitterer Erfahrung, dass die Round () - Funktion von VBA die Round-to-Even-Rounding-Methode (auch bekannt als Banker-Rundung) verwendet und nicht die häufigere Round-from-Zero-on-a-5-Methode arithmetische Rundung).

    
Gary McGill 22.06.2011 13:53
quelle
0

Wenn Sie den folgenden SQL-Ausdruck in Access ausführen, erhalten Sie 58:

%Vor%

Wenn Sie die folgende Anweisung im direkten Fenster von Access (und für jede andere Office VBA-IDE) ausführen, erhalten Sie 57:

%Vor%

Das führt mich zu der Annahme, dass VBA eine andere Möglichkeit hat, Round als Access und, wahrscheinlich anwendbarer, JET zu verwenden.

Nun, warum ist das anders? Weiß nicht ... wird jemanden mit besseren Fähigkeiten als ich nehmen.

    
ray 22.06.2011 13:58
quelle

Tags und Links