Главная страница
    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.039 c
3-1096816746
Muchacho
2004-10-03 19:19
2004.11.07
Unicode в InterBase


14-1098322441
Думкин
2004-10-21 05:34
2004.11.07
С днем рождения! 21 октября


4-1096373253
-SeM-
2004-09-28 16:07
2004.11.07
Разная работа приложения в 9х/ХР


3-1097148449
Hmm
2004-10-07 15:27
2004.11.07
Проблемма с запуском скрипта создания базы из моего приложения.


1-1098387808
oleg_
2004-10-21 23:43
2004.11.07
dll





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский