Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.035 c
15-1136196244
PARUS
2006-01-02 13:04
2006.01.29
CPL


2-1137072542
pound
2006-01-12 16:29
2006.01.29
логотип


15-1135004026
Esu
2005-12-19 17:53
2006.01.29
Мастре и Маргарита (сериал)


15-1136454216
Новичоккк
2006-01-05 12:43
2006.01.29
Разбираюсь с OllyDbg


15-1136322446
!Han!
2006-01-04 00:07
2006.01.29
Библя Делфи




   Наверх