Объясните пожалуйста следующую ситуацию и способы борьбы.
MyVar DECIMAL(20,0) MyVar = 1234567891 * 2 STOP(MyVar) ! Выдает -1825831514
а если написать так:
MyVar = 1234567891 MyVar = MyVar * 2 STOP(MyVar) !То получим 2469135782
Может кто объяснит какого ….. он преобразует DECIMAL в LONG. Все становится просто, если вспомнить из доки, что базовым типом при вычислениях (если не задан явно тип операндов) принимается LONG.
Где в твоем примере сказано, что эти операнды имеют тип, отличный от LONG? Поэтому компилятор для вычисления данного примера использует временную переменную LONG-типа для приема результата вычисления. И уже после вычисления он эту LONG-переменную преобразует в DECIMAL.
Чтобы твой пример вычислялся правильно надо написать так:
MyVar = 1234567891,00 * 2,00
Вот теперь, при вычислении, для временного хранения результата будет использована REAL-переменная. Заметь — именно REAL! Поэтому, например, для расчета суммы лучше использовать две DECIMAL-переменные. Тогда не будет потерь в копейках и общая сумма всегда сойдется.