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