Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.29;
Скачать: CL | DM;

Вниз

Непонятки форматирования   Найти похожие ветки 

 
remark   (2006-01-13 04:19) [0]

Пример ниже демонстрирует 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;


 
Джо ©   (2006-01-13 04:44) [1]

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


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

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

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 05:22) [3]

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


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

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

Джо сэнкс.


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

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


 
Leonid Troyanovsky ©   (2006-01-13 08:35) [6]


> 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.


 
Leonid Troyanovsky ©   (2006-01-13 08:43) [7]


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


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

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2006-01-13 08:47) [8]


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


Это - да.

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

--
Regards, LVT.


 
MBo ©   (2006-01-13 08:50) [9]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.01.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
1-1135656881
Alex_V
2005-12-27 07:14
2006.01.29
и все же хотелось выяснить


15-1136549265
BiggieSmalls
2006-01-06 15:07
2006.01.29
Реестр


15-1135431839
Gollandec
2005-12-24 16:43
2006.01.29
Помогите решить задачу по делфи. Никак не получается


1-1135074479
leonidus
2005-12-20 13:27
2006.01.29
Как в моей программе просмативать документы Word`а?


10-1099987341
mak
2004-11-09 11:02
2006.01.29
проблемы вызова COM сервера в WIN2003