Показать сообщение отдельно
Старый 05.04.2011, 16:36   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,712 / 1201 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Надо смотреть не результат, а промежуточные данные

X++:
static void Test_Job(Args _args)
{
    AmountCur         a,b,c,d,e,f,t1,t2;
    ;
    a = 13532.5;
    b = 100 / 2827;
    c = 2776851.86;
    d = 2776851.86;
    e = a / b;
    f = (a / b) / c * d;

    info("a / b = " + num2str(a / b,0,16,1,0));
    info("(a / b) / c = " + num2str((a / b) / c,0,16,1,0));
    info("(a / b) / c * d = " + num2str((a / b) / c * d,0,16,1,0));
    info("round((a / b) / c * d, 0.01) = " + num2str(round((a / b) / c * d, 0.01),0,16,1,0));
}
Ни одна программа не может хранить бесконечные дроби. В любом случае, количество значащих цифр мантиссы будет ограничено некоторым фиксированным числом. Скорее всего, как и большинство продуктов Microsoft, действительные данные в памяти Axapta храняться с точностью до 16 значащих цифр (точнее, то 15,95). Как следствие, выражение вида

1/3 = 0,3333333333333333

Не может иметь "бесконечное" число 3, чтобы при последующем умножении на 3 получить ровно единицу. Будет число чуть меньше единицы. На сколько "чуть" зависит от того, сколько значащих цифр хранится в данной программной оболочке

Ну, и кроме того, важными являются правила округления. Система Axapta, очевидно, использует "стандартные" правила округления

В приведенном изначально примере вопрос стоит об округлении числа

382563.7749999999000000

В данном контексте, фактически, с точностью до 2 знака после запятой. Очевидно, это будет число

382563.77

Все в соответствии с правилами округления.