Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.035 c
1-1097254844
S0N1K
2004-10-08 21:00
2004.11.07
Интерпритатор языка или что-то в этом роде.


8-1091708249
Dima_Delphi
2004-08-05 16:17
2004.11.07
Как изменять масштаб текста???


14-1090676641
Огромное Кулясищще
2004-07-24 17:44
2004.11.07
Калькулятор


1-1098696258
Arkady
2004-10-25 13:24
2004.11.07
Каталог запуска программы


1-1098284549
Vikont
2004-10-20 19:02
2004.11.07
Импорт из Екселя в SQLтаблицу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский