Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Объясните плиз природу следующего глюка: [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 - перегруженная


Наверх

Титульная страница Поиск, карта сайта Написать письмо