Я думаю, что wqw прав, но я приведу подробности.
В утверждении clng(150 * 0.85)
, 150 * 0.85
рассчитывается с расширенной точностью:
150 = 1.001011 x 2^7
0.85
с двойной точностью =
1.1011001100110011001100110011001100110011001100110011 x 2^-1
Умножьте их вручную, и вы получите
1.1111110111111111111111111111111111111111111111111111110001 x 2^6 =
127.4999999999999966693309261245303787291049957275390625
Это 59 бит, что удобно для расширенной точности.Это меньше чем 127.5
, поэтому округляется в меньшую сторону.
В операторе x = 150 * 0.85
это 59-битное значение округляется до 53 бит, что дает
1.1111111 x 2^6 = 1111111.1 = 127.5
Таким образом, оно округляется в соответствии сот половины до вечера.
(см. мою статью http://www.exploringbinary.com/when-doubles-dont-behave-like-doubles/ для получения дополнительной информации.)