Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.07;
Скачать: CL | DM;

Вниз

Объясните плиз природу следующего глюка:   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.045 c
1-1098214540
Tank Abot
2004-10-19 23:35
2004.11.07
sortirovka massivov metodom Shella


1-1098197457
Anton_G
2004-10-19 18:50
2004.11.07
глиф с альфа-каналом (полупрозрачность)


3-1096816746
Muchacho
2004-10-03 19:19
2004.11.07
Unicode в InterBase


1-1098695174
DelphiLexx
2004-10-25 13:06
2004.11.07
WndProc и ловушки


1-1098715549
Kam4atkin
2004-10-25 18:45
2004.11.07
Как правильно скопировать русский текст в буфер?