Форум: "Основная";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];
ВнизОбъясните плиз природу следующего глюка: Найти похожие ветки
← →
tria (2004-10-26 12:49) [0]var v1,v2:variant;
begin
//F1(TChild);
v1:=3.66;
v2:=12123.54;
ShowMessage(VarToStr(Min(v1,v2)));
end;
Результат не 3.66, как казалось бы, а 4.
← →
Warlock © (2004-10-26 12:50) [1]Надо явно указывать тип параметров, поскольку
функция min - перегруженная
← →
tria (2004-10-26 12:57) [2]Это я знаю, что перегруженная. При этом нет функции с параметрами типа Variant. Но почему она хватает тип Integer, не глядя на тип Variant? Есть какое-то правило на этот счет?
← →
Warlock © (2004-10-26 13:01) [3]Наверное зависит от порядка overload-ов в исходниках Delphi. Если бы первый был один из Float-ов, наверное твой код выполнялся бы верно
← →
Ega23 © (2004-10-26 13:05) [4]
ShowMessage(VarToStr(Min(Float(v1),Float(v2))));
?
← →
GuAV © (2004-10-26 13:09) [5]Вот. Ещё одна проблема overload.. :(
← →
CHES © (2004-10-26 13:10) [6]Неа
var v1,v2:variant;
begin
//F1(TChild);
v1:=3.66;
v2:=12123.54;
ShowMessage(VarToStr(Min(real(v1),v2)));
end;
← →
tria (2004-10-26 13:12) [7]Да. В исходниках первое описание идет Min(const A, B: Integer): Integer;
Выходит, перед использованием функций надо проверять, есть ли среди них перегруженная с параметрами Variant? Это ж весь юнит math надо похерить (в смысле от него отказаться). Конкретный источник ошибок.
>Ega23 ©
Если бы я знал, что там будут за данные... Может быть и currency, тогда что делать?
← →
Ega23 © (2004-10-26 13:13) [8]CHES © (26.10.04 13:10) [6]
Почему real?
← →
tria (2004-10-26 13:15) [9]Ответ заменить на If then else не предлагать. Я уже сделал. Но тока перед клиентом стыдно и за державу обидно :(
← →
Ega23 © (2004-10-26 13:15) [10]Currenсy<>Float ????
← →
tria (2004-10-26 13:19) [11]Канечна. Currenсy по природе целый тип. По значению - дробный, с четырьмя знаками после запятой. Не содержит ошибок округления.
← →
Ega23 © (2004-10-26 13:20) [12]ДА ЧТО ТЫ ГОВОРИШЬ!
Currency is a fixed-point data type that minimizes rounding errors in monetary calculations. It is stored as a scaled 64-bit integer with the four least-significant digits implicitly representing decimal places. When mixed with other real types in assignments and expressions, Currency values are automatically divided or multiplied by 10000.
← →
CHES © (2004-10-26 13:23) [13]> Ega23 Почему real?
Потому что типа float нет. Сам проверь, твой пример не скомпилируется
← →
clickmaker © (2004-10-26 13:25) [14]
> [13] CHES © (26.10.04 13:23)
> > Ega23 Почему real?
>
> Потому что типа float нет. Сам проверь, твой пример не скомпилируется
есть double
← →
tria (2004-10-26 13:27) [15]>EGA23
Пример:
c:currency;
f:double;
begin
c:=0.2;
f:=0.2;
If c<>f Then ShowMessage("111");
← →
Defunct © (2004-10-26 13:31) [16]tria (26.10.04 13:12) [7]
Напиши свою функцию, для работы с Variant.
Не так уж и сложно.
PS: я вообще никогда не пользовался стандартной min/max, написал один раз свою, там кода блин, аж 2 строчки. Ну для Variant будет возможно 6 строк с учетом Try-Except-End.
← →
CHES © (2004-10-26 13:31) [17]> clickmaker © (26.10.04 13:25) [14]
Ясно дело. А еще есть extended, single и другие вещественные типы и работать будет с любым из них. Но float - нет такого типа.
← →
Ega23 © (2004-10-26 13:33) [18]CHES © (26.10.04 13:31) [17]
Ну ошибся с T-SQL, там только float. Ты же понял прекрасно, о чём речь...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.039 c