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

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

Непонятки форматирования [D7, WinXP]


remark ©   (2006-01-13 04:19:00) 

Пример ниже демонстрирует bug c форматированием.
Если кто в курсе подскажите рецепт, как обойти.
Данный глюк наблюдается только с определёнными числами.
Закономерность не нашёл, поскольку в ассемблере не силён.
Замечено на Delphi 7.

var
 v : Double;
begin
 v := 18.455;
 ShowMessage('Variable formating: '+(FormatFloat('0.00,', v))+#13+'Direct formating: '+(FormatFloat('0.00,', 18.455)));
end;


remark   (2006-01-13 09:20:00) [1]

Спасибо за помощь всем кто ответил. Признаться я это читал когдато, но почему-то такие очевидные вещи не связял между собой. Теперь всё предельно ясно. Надо будет содателям FastReport задать вопрос.


MBo   (2006-01-13 08:50:00) [2]

http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=374


Leonid Troyanovsky   (2006-01-13 08:47:00) [3]


> remark   (13.01.06 05:36) [4]
> Workaround
> v := StrToFloat(FloatToStr(vr));
> Но криво всё это.


Это - да.

Книжечку следует почитать, что-нибудь о численных методах.

--
Regards, LVT.


Leonid Troyanovsky   (2006-01-13 08:43:00) [4]


> Джо ©   (13.01.06 05:22) [3]
> Variant, если я правильно помню, вещественные значения хранит
> как раз в Double.


 TVarRec = record
 ..
 vtExtended:   (VExtended: PExtended);

--
Regards, LVT.


Leonid Troyanovsky   (2006-01-13 08:35:00) [5]


> remark   (13.01.06 04:19)  
> Пример ниже демонстрирует bug c форматированием.
> Если кто в курсе подскажите рецепт, как обойти.
> Данный глюк наблюдается только с определёнными числами.


Дело, IMHO, не в форматировании, а в разном представлении Extended
vs Double. Бо, дельфи считает нецелочисленные константы как Extended.
См. также:

var
v : Double;
e: Extended;
begin
v := 18.455;
e := 18.455;
ShowMessage(FloatToStr(e-v));
end;


"Обойти" это нельзя, просто надо помнить особенности нецелочисленной
арифметики, и использовать подходящий для задачи тип данных.

--
Regards, LVT.


remark   (2006-01-13 06:35:00) [6]

Проверьте в FastReport формат переменной '0.00' для числа 18.455
Будете приятно удивлены


remark   (2006-01-13 05:36:00) [7]

Workaround
v := StrToFloat(FloatToStr(vr));
Но криво всё это.

Джо сэнкс.


Джо   (2006-01-13 05:22:00) [8]

Variant, если я правильно помню, вещественные значения хранит как раз в Double. Т.е, при неявном преобразовании варианта к вещественному значению будет выдаваться значение именно типа Double. В общем, наверное, в этом причина.


remark   (2006-01-13 05:04:00) [9]

Спасибо всё верно, так работает.
А почему вот так не работает я не могу врубиться.
Это как раз по моему случаю. Первый пример был упрощён.

var
 v : Extended;
 vr : Variant;
begin
 vr := 18.455;
 v := vr;
 ShowMessage('Variable formating: '+(FormatFloat('0.00,', v))+#13+'Direct formating: '+(FormatFloat('0.00,', 18.455)));
end;


Джо   (2006-01-13 04:44:00) [10]

Функция FormatFloat требует аргумента типа Extended. Замени v : Doubleна v : Extended;


Наверх

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