![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Объясните плиз природу следующего глюка: [D7]
tria © (2004-10-26 12:49:00)var v1,v2:variant;
begin
//F1(TChild);
v1:=3.66;
v2:=12123.54;
ShowMessage(VarToStr(Min(v1,v2)));
end;
Результат не 3.66, как казалось бы, а 4.
Ega23 (2004-10-26 13:33:00) [1]CHES © (26.10.04 13:31) [17]
Ну ошибся с T-SQL, там только float. Ты же понял прекрасно, о чём речь...
CHES (2004-10-26 13:31:00) [2]> clickmaker © (26.10.04 13:25) [14]
Ясно дело. А еще есть extended, single и другие вещественные типы и работать будет с любым из них. Но float - нет такого типа.
Defunct (2004-10-26 13:31:00) [3]tria (26.10.04 13:12) [7]
Напиши свою функцию, для работы с Variant.
Не так уж и сложно.
PS: я вообще никогда не пользовался стандартной min/max, написал один раз свою, там кода блин, аж 2 строчки. Ну для Variant будет возможно 6 строк с учетом Try-Except-End.
tria (2004-10-26 13:27:00) [4]>EGA23
Пример:
c:currency;
f:double;
begin
c:=0.2;
f:=0.2;
If c<>f Then ShowMessage('111');
clickmaker (2004-10-26 13:25:00) [5]
> [13] CHES © (26.10.04 13:23)
> > Ega23 Почему real?
>
> Потому что типа float нет. Сам проверь, твой пример не скомпилируется
есть double
CHES (2004-10-26 13:23:00) [6]> Ega23 Почему real?
Потому что типа float нет. Сам проверь, твой пример не скомпилируется
Ega23 (2004-10-26 13:20:00) [7]ДА ЧТО ТЫ ГОВОРИШЬ!
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.
tria (2004-10-26 13:19:00) [8]Канечна. Currenсy по природе целый тип. По значению - дробный, с четырьмя знаками после запятой. Не содержит ошибок округления.
Ega23 (2004-10-26 13:15:00) [9]Currenсy<>Float ????
tria (2004-10-26 13:15:00) [10]Ответ заменить на If then else не предлагать. Я уже сделал. Но тока перед клиентом стыдно и за державу обидно :(
Ega23 (2004-10-26 13:13:00) [11]CHES © (26.10.04 13:10) [6]
Почему real?
tria (2004-10-26 13:12:00) [12]Да. В исходниках первое описание идет Min(const A, B: Integer): Integer;
Выходит, перед использованием функций надо проверять, есть ли среди них перегруженная с параметрами Variant? Это ж весь юнит math надо похерить (в смысле от него отказаться). Конкретный источник ошибок.
>Ega23 ©
Если бы я знал, что там будут за данные... Может быть и currency, тогда что делать?
CHES (2004-10-26 13:10:00) [13]Неа
var v1,v2:variant;
begin
//F1(TChild);
v1:=3.66;
v2:=12123.54;
ShowMessage(VarToStr(Min( real(v1),v2)));
end;
GuAV (2004-10-26 13:09:00) [14]Вот. Ещё одна проблема overload.. :(
Ega23 (2004-10-26 13:05:00) [15]
ShowMessage(VarToStr(Min(Float(v1),Float(v2))));?
Warlock (2004-10-26 13:01:00) [16]Наверное зависит от порядка overload-ов в исходниках Delphi. Если бы первый был один из Float-ов, наверное твой код выполнялся бы верно
tria (2004-10-26 12:57:00) [17]Это я знаю, что перегруженная. При этом нет функции с параметрами типа Variant. Но почему она хватает тип Integer, не глядя на тип Variant? Есть какое-то правило на этот счет?
Warlock (2004-10-26 12:50:00) [18]Надо явно указывать тип параметров, поскольку
функция min - перегруженная