Проблемы с FloatToStr()
Модератор: Модераторы
Проблемы с FloatToStr()
В Делфи:
FloatToStr(-58.399999999999999)="-58.4"
В Лазаре:
FloatToStr(-58.399999999999999)="-58.399999999999999"
Собственно вопрос в следующем.
Ка сделать, чтобы в Лазаре работало так как в Делфи?
FloatToStr(-58.399999999999999)="-58.4"
В Лазаре:
FloatToStr(-58.399999999999999)="-58.399999999999999"
Собственно вопрос в следующем.
Ка сделать, чтобы в Лазаре работало так как в Делфи?
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Код: Выделить всё
Format('%.1f', [-58.399999999999999])shade писал(а):Код: Выделить всё
Format('%.1f', [-58.399999999999999])
Не подходит. Я заранее не знаю, сколько точек после запятой у меня должно получится.
Или есть какая-то спецификация форматной строки, о которой я не знаю?
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/
- Контактная информация:
STAKANOV писал(а):А это действителдьно так? Т.е проверка проводилась именно
Проверка производилась следующим образом:
Код: Выделить всё
Edit1.Text:=FloatToStr(-58.399999999999999)И вообще, разница вылезла при тестировании приложения, перенесенного из Делфи.
shade писал(а):Ну никто не заставляет задавать число знаков после запятой константой, можно формировать форматирующий шаблон в runtime.tria писал(а):Не подходит. Я заранее не знаю, сколько точек после запятой у меня должно получится.
IHMO, лутше явно указывать число знаков после запятой..
У меня - результат вычисления выражения, введенного пользователем.
Скажем так, что-то наподобие результата вычисления произвольного скрипта. Просчитывать, сколько знаков должен содержать результат - это ой как не просто.
>STAKANOV
Сори, чего-то протормозил проверить. Код:
FloatToStr(double(-58.399999999999999))
приводит к тому же результату
А может попробовать скопировать целиком дельфовую функцию из исходников? Там вся функция на ассемблере. Только вот не знаю двух вещей:
1. Что за {$IFDEF PIC}? (что такое {$IFDEF} я знаю).
2. Будет ли такой код потом работать под Линуксом (вызовов прерываний в нем нет)?
Сори, чего-то протормозил проверить. Код:
FloatToStr(double(-58.399999999999999))
приводит к тому же результату
А может попробовать скопировать целиком дельфовую функцию из исходников? Там вся функция на ассемблере. Только вот не знаю двух вещей:
1. Что за {$IFDEF PIC}? (что такое {$IFDEF} я знаю).
2. Будет ли такой код потом работать под Линуксом (вызовов прерываний в нем нет)?
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
tria писал(а):1. Что за {$IFDEF PIC}? (что такое {$IFDEF} я знаю).
2. Будет ли такой код потом работать под Линуксом (вызовов прерываний в нем нет)?
1. В Дельфи символ PIC определен при компиляции позиционно-независимого кода. Это необходимо для Linux, где не поддерживается таблица релокации. В винде можно и без него, но с ним не повредит - просто объем кода будет чуть-чуть побольше.
2. Заставить код работать под Linux теоретически можно (он ведь в исходном варианте там работает), но сколько на это придется угробить сил - сказать сложно...
А вообще, я бы еще поэкспериментировал с ф-цией FormatFloat. Она дает несколько иные результаты, нежели FloatToStr. Также наблюдается определенная разница между Format('%f', [value]) и Format('%g', [value]).
p.s. 2006 год на дворе, а всю эту хрень с плавающей запятой до сих пор приходится отлаживать с помощью плясок с бубном...
>>Скажем так, что-то наподобие результата вычисления произвольного скрипта. Просчитывать, сколько знаков должен содержать результат - это ой как не просто.
Такого не бывает. что за задача?
В дельфи тоже могут вылести девятки - особенность плавающей запятой
я использую
function FloatToStr(Value: Extended; const FormatSettings: TFormatSettings): string;
Такого не бывает. что за задача?
В дельфи тоже могут вылести девятки - особенность плавающей запятой
я использую
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
- Откуда: Зеленоград
zub писал(а):>>
Такого не бывает. что за задача?
TFormatSettings): string;
Боюсь, будет как в анекдоте - быстрее наливай, а то сейчас начнется
Задача - построение системы учета, в которой пользователь настраивает все - от структуры БД до формул заполнения документов и отчетов.
Соответственно, чего имеет в виду пользователь при построении того или иного выражения, я не знаю.
zub писал(а):В дельфи тоже могут вылести девятки - особенность плавающей запятой
TFormatSettings): string;
Так не вылезали же!
Как я понимаю, в функции FloatToStr в делфях предусмотрена проблема точности.
При чем эту возможность я использовал при сравнении численных величин. Сначала преобразовывал в строку, а затем уже сравнивал.
Я использую
Код: Выделить всё
floattostrf(myfloat, FFfixed, 7, 3)Stargazer писал(а):Я используюКод: Выделить всё
floattostrf(myfloat, FFfixed, 7, 3)
Повторюсь еще раз. Я НЕ ЗНАЮ, СКОЛЬКО ЗНАКОВ ПОСЛЕ ЗАПЯТОЙ ДОЛЖНО БЫТЬ У ЧИСЛА.
Число - это результат вычисления произвольного математического выражения, заданного пользователем.
