I4GL to .NET — пытаемся понять десятичные и целые числа

Исходя из .NET, я пытаюсь понять следующее.

DEFINE total_real DECIMAL(12,5)
DEFINE total_dec  DECIMAL(6,5)
DEFINE total_int  SMALLINT

LET total_real = (total_real / 50)      
LET total_int = total_real
LET total_dec = total_real - total_int

Какова цель total_real - total_int?

Я пытался сделать что-то подобное с С#, но не могу сделать это без предварительного преобразования total_int в double/decimal. Это просто преобразование decimal в int?


person causita    schedule 21.01.2015    source источник


Ответы (2)


Вы должны прочитать руководство по 4GL!

Похоже, что код берет «действительное число», делит его на 50, а затем получает части «целого числа» и «десятичной дроби».

person Richard Schneider    schedule 21.01.2015

Код написан опасно, но, как предположил Ричард Шайдер в своем answer, цель состоит в том, чтобы получить целую и дробную часть числа.

Проблема в том, что SMALLINT — это 16-битная величина с диапазоном ±32 767 (-32 768 зарезервировано для представления NULL). И DECIMAL(12,5) может принимать значения до 9 999 999,99999 по величине. И это число, деленное на 50, намного больше, чем диапазон значений, который умещается в SMALLINT.

Выполняя работу во всех десятичных числах, вы можете использовать:

DEFINE total_real DECIMAL(12,5)
DEFINE total_dec  DECIMAL(6,5)
DEFINE total_frac DECIMAL(6,0)

LET total_real = (total_real / 50)      
LET total_int  = TRUNC(total_real)
LET total_frac = total_real - total_int

В качестве альтернативы просто измените SMALLINT на INTEGER. INTEGER — это 32-битная величина со знаком.

person Jonathan Leffler    schedule 21.01.2015