Проблемы с FloatToStr()

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

tria
постоялец
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10
Контактная информация:

Проблемы с FloatToStr()

Сообщение tria »

В Делфи:
FloatToStr(-58.399999999999999)="-58.4"
В Лазаре:
FloatToStr(-58.399999999999999)="-58.399999999999999"
Собственно вопрос в следующем.
Ка сделать, чтобы в Лазаре работало так как в Делфи?
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

Код: Выделить всё

Format('%.1f', [-58.399999999999999])
tria
постоялец
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10
Контактная информация:

Сообщение tria »

shade писал(а):

Код: Выделить всё

Format('%.1f', [-58.399999999999999])


Не подходит. Я заранее не знаю, сколько точек после запятой у меня должно получится.
Или есть какая-то спецификация форматной строки, о которой я не знаю?
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

tria писал(а):В Делфи:
FloatToStr(-58.399999999999999)="-58.4"


А это действителдьно так? Т.е проверка проводилась именно

Код: Выделить всё

if FloatToStr(-58.399999999999999)='-58.4' then
 writeln('yes')
else
 writeln('no');


или что-то вроде этого? Если да, то возможно надо явно указать тип аргумента, наример так

Код: Выделить всё

FloatToStr(double(-58.399999999999999))
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

tria писал(а):Не подходит. Я заранее не знаю, сколько точек после запятой у меня должно получится.
Ну никто не заставляет задавать число знаков после запятой константой, можно формировать форматирующий шаблон в runtime.
IHMO, лутше явно указывать число знаков после запятой..
tria
постоялец
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10
Контактная информация:

Сообщение tria »

STAKANOV писал(а):А это действителдьно так? Т.е проверка проводилась именно


Проверка производилась следующим образом:

Код: Выделить всё

Edit1.Text:=FloatToStr(-58.399999999999999)


И вообще, разница вылезла при тестировании приложения, перенесенного из Делфи.
tria
постоялец
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10
Контактная информация:

Сообщение tria »

shade писал(а):
tria писал(а):Не подходит. Я заранее не знаю, сколько точек после запятой у меня должно получится.
Ну никто не заставляет задавать число знаков после запятой константой, можно формировать форматирующий шаблон в runtime.
IHMO, лутше явно указывать число знаков после запятой..


У меня - результат вычисления выражения, введенного пользователем.
Скажем так, что-то наподобие результата вычисления произвольного скрипта. Просчитывать, сколько знаков должен содержать результат - это ой как не просто.
tria
постоялец
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10
Контактная информация:

Сообщение tria »

>STAKANOV
Сори, чего-то протормозил проверить. Код:
FloatToStr(double(-58.399999999999999))
приводит к тому же результату :(

А может попробовать скопировать целиком дельфовую функцию из исходников? Там вся функция на ассемблере. Только вот не знаю двух вещей:
1. Что за {$IFDEF PIC}? (что такое {$IFDEF} я знаю).
2. Будет ли такой код потом работать под Линуксом (вызовов прерываний в нем нет)?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

tria писал(а):1. Что за {$IFDEF PIC}? (что такое {$IFDEF} я знаю).
2. Будет ли такой код потом работать под Линуксом (вызовов прерываний в нем нет)?


1. В Дельфи символ PIC определен при компиляции позиционно-независимого кода. Это необходимо для Linux, где не поддерживается таблица релокации. В винде можно и без него, но с ним не повредит - просто объем кода будет чуть-чуть побольше.
2. Заставить код работать под Linux теоретически можно (он ведь в исходном варианте там работает), но сколько на это придется угробить сил - сказать сложно...

А вообще, я бы еще поэкспериментировал с ф-цией FormatFloat. Она дает несколько иные результаты, нежели FloatToStr. Также наблюдается определенная разница между Format('%f', [value]) и Format('%g', [value]).

p.s. 2006 год на дворе, а всю эту хрень с плавающей запятой до сих пор приходится отлаживать с помощью плясок с бубном...
zub
долгожитель
Сообщения: 2892
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Скажем так, что-то наподобие результата вычисления произвольного скрипта. Просчитывать, сколько знаков должен содержать результат - это ой как не просто.
Такого не бывает. что за задача?
В дельфи тоже могут вылести девятки - особенность плавающей запятой
я использую
function FloatToStr(Value: Extended; const FormatSettings: TFormatSettings): string;
Последний раз редактировалось zub 22.08.2006 19:50:36, всего редактировалось 1 раз.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

zub писал(а):а вот так?
function FloatToStr(Value: Extended; const FormatSettings: TFormatSettings): string;


Так пока что нельзя - этот вариант функции еще не реализован...
zub
долгожитель
Сообщения: 2892
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>я использую
>>function FloatToStr(Value: Extended; const FormatSettings: TFormatSettings): string;
Упс.. этот кусок кода закоментирован.... :oops:
tria
постоялец
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10
Контактная информация:

Сообщение tria »

zub писал(а):>>
Такого не бывает. что за задача?
TFormatSettings): string;

Боюсь, будет как в анекдоте - быстрее наливай, а то сейчас начнется :)
Задача - построение системы учета, в которой пользователь настраивает все - от структуры БД до формул заполнения документов и отчетов.
Соответственно, чего имеет в виду пользователь при построении того или иного выражения, я не знаю.

zub писал(а):В дельфи тоже могут вылести девятки - особенность плавающей запятой
TFormatSettings): string;

Так не вылезали же!
Как я понимаю, в функции FloatToStr в делфях предусмотрена проблема точности.
При чем эту возможность я использовал при сравнении численных величин. Сначала преобразовывал в строку, а затем уже сравнивал.
Stargazer
новенький
Сообщения: 52
Зарегистрирован: 30.05.2005 09:46:32

Сообщение Stargazer »

Я использую

Код: Выделить всё

floattostrf(myfloat, FFfixed, 7, 3)
tria
постоялец
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10
Контактная информация:

Сообщение tria »

Stargazer писал(а):Я использую

Код: Выделить всё

floattostrf(myfloat, FFfixed, 7, 3)


Повторюсь еще раз. Я НЕ ЗНАЮ, СКОЛЬКО ЗНАКОВ ПОСЛЕ ЗАПЯТОЙ ДОЛЖНО БЫТЬ У ЧИСЛА.
Число - это результат вычисления произвольного математического выражения, заданного пользователем.
Ответить