¿Por qué Clng funciona de manera diferente en estos escenarios y puede reproducirse en SQL Server? (No redondeo del banquero)

La ejecución de la siguiente declaración da como resultado Access SQL:

CLNG((CCUR(1.225)/1)*100) = 123

La conversión va,Decimal > Currency > Double > Double > Long

Si elimino la función de conversión CCUR:

CLNG(((1.225)/1)*100) = 122

La conversión aquí va,Decimal > Double > Double > Long

¿Cuál es la diferencia entre estos dos?

Esto se extiende a ser diferente entre SQL Code y Access

En Access SQL

 clng((CCUR(1.015)/1)*100)/100 = 1.01 (Wrong Rounding)

En Access VBA

 clng((CCUR(1.015)/1)*100)/100 = 1.02 (Appropriate Rounding Here)

Microsoft explica que la función CLng usaRedondeo del banquero, aquí.

Cuando la parte fraccionaria es exactamente 0.5, CInt y CLng siempre la redondean al número par más cercano. Por ejemplo, 0.5 redondea a 0 y 1.5 redondea a 2. CInt y CLng difieren de las funciones Fix e Int, que truncan, en lugar de redondear, la parte fraccionaria de un número. Además, Fix e Int siempre devuelven un valor del mismo tipo que se pasa.

Mirando una pregunta similar y la respuesta posteriorAQUÍ, explica que hay cambios en el cálculo de bits detrás de escena, en función de cómo se calcula, pero no estoy seguro de cómo lo afecta el tipo de datos.

¿Qué me estoy perdiendo y por qué está calculando de esta manera? ¿Cómo podría reproducir este comportamiento de manera predecible enSQL Server?

EDITAR

Después de investigar un poco, creo que este es realmente el resultado de un problema de punto de redondeo. En el servidor SQL, redondeará los flotantes al número entero más cercano si está fuera del máximo de 15 dígitos de precisión. El acceso parece mantenerse de alguna manera, a pesar de que unDouble es equivalente a unFloat(53) enTSQL.

Respuestas a la pregunta(1)

Su respuesta a la pregunta