Я бы сказал, что вы столкнулись с проблемой "банковского округления" и указали неверные данные :-) Delphi RoundTo реализует банковское округление: нечетные числа, оканчивающиеся на .5, округляются в большую сторону, это традиционное поведение, но... Четные числа которые заканчиваются на .5, округляются вниз! Таким образом, 1,5 округляется до 2,0, а 2,5 округляется до 2,0 (ссылка на ссылку RoundTo< /а>)
Второй вариант: http://www.merlyn.demon.co.uk/pas-chop.htm#DRT в некоторых версиях Delphi есть ошибка. У вас одна и та же версия Delphi на всех машинах?
Третья возможность: вы говорите о плавающих точках! Это не точные цифры! Их сложение и вычитание создает невидимый микромир десятичных знаков 0,1 + 0,2 != 0,3!! Возможно, то, что вы видите как 0,5, не совсем 0,5, а 0,49999999 или 0,500000001. Если вы хотите проверить это, войдите в отладчик и проверьте, является ли c = 3675.05
(логическое выражение) истинным или ложным, если round(c, -1) = 3675.1
является истинным или ложным и так далее. Если вы хотите исследовать мир fp, попробуйте это: http://pages.cs.wisc.edu/~rkennedy/exact-float
Четвертая возможность: округление 3675,05 изменяется, если вы используете Single или Double. С Single это 3675,1, с Double это 3675 :-) Ах... волшебный мир поплавков :-)
Если вы хотите использовать математические трюки, используйте тип валюты (это число с фиксированной точкой и не имеет этих проблем).
Есть и последняя возможность, но она маловероятна: процессор Intel сохраняет промежуточные результаты операций Double как 80-битные fp, а затем "округляет" их на выходе до 64-битных. Некоторые компиляторы/языки вводят необязательную оптимизацию (которая активируется при запуске программы, если это возможно) для использования кодов операций SSE2, присутствующих в некоторых процессорах, вместо FPU процессора. SSE2 работает с 64-битной частотой кадров, поэтому нет повышения до 80 бит и понижения с 80 бит. Это может вызвать то, что вы видите. Прочтите здесь Различия между x87 FPU и SSE2.
person
xanatos
schedule
11.10.2011