![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Различия 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 такой результат?
статью прочитал "по диагонали", не думая. смысл ее упустил.