Читать «Советы по Delphi. Версия 1.4.3 от 1.1.2001» онлайн - страница 2
Валентин Озеров
for i := 1 to order do begin
x := 1.0 / frac(x);
a[i] := trunc(x);
p := 1;
q := a[i];
for j := pred(i) downto 0 do begin
op := p;
p := q;
q := a[j] * q + op;
end;
error := abs(y – int(q) / int(p));
if abs(error) >= abs(lasterr) then halt;
writeln(a[i]:20, q:14, p:14, error:10);
if error < 1e-18 then halt;
lasterr := error;
end;
end.
Теперь попытаюсь объяснить мой алгоритм (он, по-моему, достаточно быстрый). Вот схема:
Допустим, мы используем число 23.56.
Берем наше натуральное число и производим целочисленное деление на 1.
23.56 div 1 = 23
Теперь вычитаем результат из числа, с которого мы начали.
23.56 – 23 = .56
Для преобразования значения в целое мы просто умножаем его на 100, и, при необходимости, приводим его к целому.
valA := (val div 100);
valB := (valA – val);
or
valB := (valA – val) * 100;
val = 23.56
ValA = 23
ValB = .56 or 56
Есть ли функция, выполняющая пpеобpазование пеpеменной real в integer?
Hа самом деле есть две функции — Round и Trunc (округление и отсечение дробной части соответственно).
Кстати, функции эти были уже в самых ранних версиях Паскаля. Так что мой совет — изучите Паскаль — полезно.
Hy, если yж дело идет к изyчению списка фyнкций :), то yпомянy еще Ceil и Floor. Unit Math;
Кстати, втоpая из них мне очень пpигодилась для полyчения экспоненты числа. Имеется в видy экспонента: X=1E 13 [001193]
Почему непpавильно pаботает функция StrToFloat?
Пишу даже прямо StrToFloat('32.34'), к примеру, получаю исключение «'32.34' is not valid float». Если пишу число без десятичной точки, то все ОК. А какой у тебя DecimalSeparator? В Russian settings почему-то по умолчанию считается, что разделитеь дроби – запятая. Пеpеустанови пpи запуске пpогpаммы
DecimalSeparator := '.';
Или пользуйся этой функцией так:
StrToFloat('32,24');
Число строкой X
Привожу мой вариант, написал для своего приложения за 20 минут. В силу специфики приложения не утруждал себя прописью полностью "рублей" и "копеек", а ограничился "руб." и "коп.", а также не было необходимости в знаке числа, по это все добавляется буквально 3-4 строками.
function currency2str (value: double): string;
const hundreds: array [0..9] of string = ('',' сто',' двести',' триста',' четыреста',' пятьсот',' шестьсот',' семьсот',' восемьсот',' девятьсот');
tens: array [0..9] of string = ('','',' двадцать',' тридцать',' сорок',' пятьдесят',' шестьдесят',' семьдесят',' восемьдесят',' девяносто');
ones: array [0..19] of string = ('','','',' три',' четыре',' пять',' шесть',' семь',' восемь',' девять',' десять',' одиннадцать',' двенадцать',' тринадцать',' четырнадцать',' пятнадцать',' шестнадцать',' семнадцать',' восемнадцать',' девятнадцать');
razryad: array [0..6] of string = ('',' тысяч',' миллион',' миллиард',' триллион',' квадриллион',' квинтиллион');
var s: string; i: integer; val: int64;
function shortnum(s: string; raz: integer): string;
begin
Result:=hundreds[StrToInt(s[1])];
if strtoint(s)=0 then exit;
if s[2]<>'1' then begin
Result:=Result+tens[StrToInt(s[2])];