В зависимости от того, какого происхождения числа, можно поступать так.
1. Работать с погрешностью. Например.
q := X1 / X2;
if abs(q - Round(q)) < 1e-5 then ...
Я в основном сейчас на «си с крестами» и непривычка не брать условие в скобки :)
2. Работать в рациональных числах.
type
TRatio = record
Num, Den : integer;
end;
Думаю, сами сможете написать операции ±×/ и, если надо, сокращение.
3. Работать в фиксированной запятой — например, перевести рубли в копейки.
var
X1 : integer = 100;
X2 : integer = 20;
if X1 mod X2 = 0 then ...
4. Работать в десятичной длинной арифметике. Это уже совсем «большая пушка», и может быть что-то типа
type
TDecFloat = record
mantissa : uint64; // например, от 1e17 до 1e18
order : integer;
sign : boolean;
end;
Примерно так можно сделать калькулятор, работающий в десятичной системе и переводящий в extended и обратно, если, например, нужно взять синус. Погрешность перевода для трансцендентных функций, разумеется, будет, зато 0,2 в такой системе — это точное 0,2, и это важно для калькуляторов: он вычислит в точности то, что человек вычислит ручкой на бумаге.
ВНИМАНИЕ! Для методов 2,3,4 придётся переработать всю цепочку, через которую появляются 1 и 0,2. В float/double нет числа 0,2, и точка.