Форум: "Начинающим";
Текущий архив: 2008.03.16;
Скачать: [xml.tar.bz2];
ВнизРазличия VarCast varCurrency -> varSingle, varCurrency->varDouble Найти похожие ветки
← →
Skyle © (2008-02-19 07:15) [0]Пишем простенький тестовый пример, 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 08:28) [1]> Да, VarToStr(V1) даёт "723.54"
с чего это? также будет со всем мусором.
> но если это выдать в Excel или vbs
и настроить формат отображения на 2 знака после запятой, то мусора не будет... или передать более "корректным" типом, или даже строкой чтобы он сам сконвертировал в свой "Double" - тоже не будет.
> Что я упускаю, почему в Single такой результат?
статью прочитал "по диагонали", не думая. смысл ее упустил.
← →
Skyle © (2008-02-19 08:55) [2]
> sniknik © (19.02.08 08:28) [1]
> > Да, VarToStr(V1) даёт "723.54"
> с чего это? также будет со всем мусором.
Эксперимент показывает что нет. Последняя строка примера. Покажет без мусора.
> > но если это выдать в Excel или vbs
> и настроить формат отображения на 2 знака после запятой,
> то мусора не будет... или передать более "корректным" типом,
> или даже строкой чтобы он сам сконвертировал в свой "Double"
> - тоже не будет.
Если в екселе настроить отображение, то будет отображаться два знака. Но значение в ячейке будет с мусором.
>
> > Что я упускаю, почему в Single такой результат?
> статью прочитал "по диагонали", не думая. смысл ее упустил.
>
Может быть и по диагонали, но я так и не понял, в чём разница между Single и Double в случае конечных двоичных дробей.
← →
Григорьев Антон © (2008-02-19 09:23) [3]
> Skyle © (19.02.08 08:55) [2]
> Эксперимент показывает что нет. Последняя строка примера.
> Покажет без мусора.
"Покажет без мусора" и "не будет содержать мусора" - разные вещи. Когда мусор слишком мал, при преобразовании числа в строку он отбрасывается. Но это не значит, что его там вообще нет.
> я так и не понял, в чём разница между Single и Double в
> случае конечных двоичных дробей
В количестве разрядов и, как следствие, величине мусора.
← →
Skyle © (2008-02-19 09:30) [4]
> Григорьев Антон © (19.02.08 09:23) [3]
Похоже мне не надо было думать что число 723 слишком маленькое для того, чтобы появились проблемы у Single, а просто разложить его и посмотреть.
Ладно, всем спасибо, вопрос похоже исчерпан.
← →
sniknik © (2008-02-19 11:13) [5]> Эксперимент показывает что нет. Последняя строка примера. Покажет без мусора.
нет возможности попробовать в D5, но в D7 ShowMessage(VarToStr(V1)) показывает как раз с "мусором".
а вот в окне просмотра в IDE округляет до 2 знаков.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.03.16;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c