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

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

Различия VarCast varCurrency -> varSingle, varCurrency->varDouble [D5, XP]


Skyle ©   (2008-02-19 07:15:00) 

Пишем простенький тестовый пример, D5.

var
 V, V1, V2 : Variant;
begin
 V := 723.54;
 VarCast(V1, V, varSingle);
 VarCast(V2, V, varDouble);
 ShowMessage(VarToStr(V1)); //тут точка останова
end;


Ставим breakpoint на указанную строку, идём в WatchList, добавляем
TVarData(V).vCurrency (видим 723.54)
TVarData(V2).vDouble (видим те же 723.54)
TVarData(V1).vSingle (а вот тут видим 723.53997803)

Да, VarToStr(V1) даёт '723.54', но если это выдать в Excel или vbs, то там виден весь мусор.

Статью Григорьева про особенности я читал, но видимо тут дело в какой-то внутренней обработке вариантов именно в D5. В хелпе написано, что при "Variant type conversions" из real в real происходит "converts real formats", описания которого я не нашёл.

Что я упускаю, почему в Single такой результат?


sniknik   (2008-02-19 11:13:00) [1]

> Эксперимент показывает что нет. Последняя строка примера. Покажет без мусора.
нет возможности попробовать в D5, но в D7 ShowMessage(VarToStr(V1)) показывает как раз с "мусором".

а вот в окне просмотра в IDE округляет до 2 знаков.


Skyle   (2008-02-19 09:30:00) [2]


> Григорьев Антон ©   (19.02.08 09:23) [3]

Похоже мне не надо было думать что число 723 слишком маленькое для того, чтобы появились проблемы у Single, а просто разложить его и посмотреть.

Ладно, всем спасибо, вопрос похоже исчерпан.


Григорьев Антон   (2008-02-19 09:23:00) [3]


> Skyle ©   (19.02.08 08:55) [2]
> Эксперимент показывает что нет. Последняя строка примера.
>  Покажет без мусора.

"Покажет без мусора" и "не будет содержать мусора" - разные вещи. Когда мусор слишком мал, при преобразовании числа в строку он отбрасывается. Но это не значит, что его там вообще нет.

> я так и не понял, в чём разница между Single и Double в
> случае конечных двоичных дробей

В количестве разрядов и, как следствие, величине мусора.


Skyle   (2008-02-19 08:55:00) [4]


> sniknik ©   (19.02.08 08:28) [1]
> > Да, VarToStr(V1) даёт '723.54'
> с чего это? также будет со всем мусором.

Эксперимент показывает что нет. Последняя строка примера. Покажет без мусора.


> > но если это выдать в Excel или vbs
> и настроить формат отображения на 2 знака после запятой,
>  то мусора не будет... или передать более "корректным" типом,
>  или даже строкой чтобы он сам сконвертировал в свой "Double"
> - тоже не будет.

Если в екселе настроить отображение, то будет отображаться два знака. Но значение в ячейке будет с мусором.


>
> > Что я упускаю, почему в Single такой результат?
> статью прочитал "по диагонали", не думая. смысл ее упустил.
>

Может быть и по диагонали, но я так и не понял, в чём разница между Single и Double в случае конечных двоичных дробей.


sniknik   (2008-02-19 08:28:00) [5]

> Да, VarToStr(V1) даёт '723.54'
с чего это? также будет со всем мусором.

> но если это выдать в Excel или vbs
и настроить формат отображения на 2 знака после запятой, то мусора не будет... или передать более "корректным" типом, или даже строкой чтобы он сам сконвертировал в свой "Double" - тоже не будет.

> Что я упускаю, почему в Single такой результат?
статью прочитал "по диагонали", не думая. смысл ее упустил.


Наверх

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