Creo wqw es correcto, pero yo voy a dar los detalles.
En la declaración clng(150 * 0.85)
, 150 * 0.85
se calcula en ampliada precisión:
150 = 1.001011 x 2^7
0.85
en doble precisión =
1.1011001100110011001100110011001100110011001100110011 x 2^-1
multiplicar estos con la mano y se obtiene
1.1111110111111111111111111111111111111111111111111111110001 x 2^6 =
127.4999999999999966693309261245303787291049957275390625
Eso es 59 bits, que se adapta cómodamente a ext fin de precisión. Es menos que 127.5
así que redondea hacia abajo.
En la declaración x = 150 * 0.85
, ese valor 59 bit se redondea a 53 bits, dando
1.1111111 x 2^6 = 1111111.1 = 127.5
Así que repasa según redonda medio-a-par.
(Vea mi artículo http://www.exploringbinary.com/when-doubles-dont-behave-like-doubles/ para más información.)
Weird. 'CLng (CDbl (150 * 0.85))' lo arregla. 'Round (150 * 0.85)' también. – wqw
También lo hace CSng. Según mi teoría, fue un error de coma flotante. –