Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
1 / 1 / 1
Регистрация: 06.05.2017
Сообщений: 60

StrToFloat ошибка при сравнении

07.07.2017, 05:50. Показов 1818. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал программу на 4000+ строк, но не понимаю почему получается следующая ситуация

Delphi
1
2
3
4
5
6
7
8
procedure TForm1.Button1Click(Sender: TObject);
begin
  edit1.Text := '0,15';
  edit2.Text := '0,13';
 
  if strtofloat(edit1.text) > strtofloat(edit2.text) + 0.02 then
    showmessage('bolshe') else showmessage('ne bolshe');
end;
Вылезает сообщение "bolshe". Почему?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.07.2017, 05:50
Ответы с готовыми решениями:

Ошибка с StrToFloat: '402.101' is not valid floating point value.
Всем привет. У меня такая проблема: Стоит Delphi6 на win2000 server, написал прогу, в которой есть функция StrToFloat, всё работает....

Ошибка в сравнении ключей .Бинарное дерево. Delphi
Всем доброго времени суток! Есть задача: построить АА-дерево поиска. Проблема в следующем. В теории создании я разобрался, но как...

Регистр букв при сравнении выражений
function prov(e:string):boolean; var i:string; begin prov:=false; while not form2.ADOQuery7.Eof do begin //...

20
Айлурофил
 Аватар для Massaraksh7
514 / 447 / 112
Регистрация: 27.05.2017
Сообщений: 2,688
Записей в блоге: 5
07.07.2017, 06:45
Во-первых, какой у тебя DecimalSeparator?
Во-вторых, вещественные числа так сравнивать на равенство некорректно.
0
1 / 1 / 1
Регистрация: 06.05.2017
Сообщений: 60
07.07.2017, 07:07  [ТС]
Massaraksh7, да, я уже почитал про вещественные числа...
в таком случае, подскажите пожалуйста, как лучше сравнивать числа с двумя знаками после запятой.
0
Айлурофил
 Аватар для Massaraksh7
514 / 447 / 112
Регистрация: 27.05.2017
Сообщений: 2,688
Записей в блоге: 5
07.07.2017, 07:18
Сравнение на равенство:
Delphi
1
2
if Abs(x1-x2)<1e-30 then ShowMessage('Равны') else 
   if x1>x2 then ShowMessage('Больше') else ShowMessage('Меньше');
И я про DecimalSeparator спросил.
0
1 / 1 / 1
Регистрация: 06.05.2017
Сообщений: 60
07.07.2017, 08:07  [ТС]
Massaraksh7, наверное точка, раз уж компилятор не ругается на числа с точкой в коде. Просто я не знаю где посмотреть
0
Айлурофил
 Аватар для Massaraksh7
514 / 447 / 112
Регистрация: 27.05.2017
Сообщений: 2,688
Записей в блоге: 5
07.07.2017, 08:12
В теле программы всегда точка. А вот в Edit1 и Edit2 у вас - запятая. Если DecimalSeparator - точка, то это ошибочные числа.
Посмотреть можно так:
Delphi
1
Label1.Caption:=DecimalSeparator;
0
1 / 1 / 1
Регистрация: 06.05.2017
Сообщений: 60
07.07.2017, 08:19  [ТС]
Massaraksh7, выводит вообще такую стрелку 
0
Модератор
 Аватар для D1973
9921 / 6457 / 2457
Регистрация: 21.01.2014
Сообщений: 27,401
Записей в блоге: 3
07.07.2017, 09:53
Цитата Сообщение от qad_quolo Посмотреть сообщение
выводит вообще такую стрелку 
qad_quolo, что-то Вы ерунду говорите (или не то делаете, кода Вы не показали)... В Д7 разделитель целой и дробной части числа выводится на экран именно так, как сказал Massaraksh7, в старших версиях надо сделать так:
Delphi
1
Label1.Caption:=FormatSettings.DecimalSeparator;
но по другому он там и не скомпилируется... Откуда у Вас такая стрелка - не понятно...
0
1 / 1 / 1
Регистрация: 06.05.2017
Сообщений: 60
07.07.2017, 11:07  [ТС]
D1973, вашим способом вылезла ","
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
07.07.2017, 11:30
чего вы прицепились к разделителю? у ТС все компилируется, следовательно все правильно в синтаксисе
0
07.07.2017, 11:38

Не по теме:

Цитата Сообщение от DenNik Посмотреть сообщение
чего вы прицепились к разделителю?
Цитата Сообщение от qad_quolo Посмотреть сообщение
Просто я не знаю где посмотреть
Ну, просто показали, как посмотреть... :pardon:

0
07.07.2017, 12:29

Не по теме:

Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Во-первых, какой у тебя DecimalSeparator?
Massaraksh7 задал вопрос и повел ненужное обсуждение 8-)

0
Айлурофил
 Аватар для Massaraksh7
514 / 447 / 112
Регистрация: 27.05.2017
Сообщений: 2,688
Записей в блоге: 5
07.07.2017, 14:30
Что значит ненужное? А почему не должно компилироваться '0,15' ? Но, если decimalseparator='.' то число восприниматься не будет, как вещественное.
0
1 / 1 / 1
Регистрация: 06.05.2017
Сообщений: 60
07.07.2017, 21:35  [ТС]
Кто-то может еще предложить способ сравнения внутри условия таких чисел как 0.15 и 0.13+0.02

у меня есть идея сделать процедуру обработки строки на удаление запятой и тем самым приведения числа к целому значению, но это уже какие-то дебри. Хотелось бы найти какой-то правильный вариант

Добавлено через 1 час 48 минут
короче сделал такую функцию
Delphi
1
2
3
4
5
6
7
8
9
10
function strto100x(a : string) : int64;
begin
  if pos(',',a) > 0 then
    if pos(',',a) <= length(a)-2 then
      RESULT := strtoint64(copy(a, 1, pos(',',a)-1) + copy(a, pos(',',a)+1, 2))
    else if pos(',',a) = length(a)-1 then
      RESULT := strtoint64(copy(a, 1, pos(',',a)-1) + copy(a, pos(',',a)+1, 1))*10
         else RESULT := strtoint64(copy(a, 1, pos(',',a)-1))*100
  else result := strtoint64(a)*100;
end;
теперь strto100x('0,15') > strto100x('0,13') + 2 сравнивает правильно
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,611
08.07.2017, 02:06
Цитата Сообщение от qad_quolo Посмотреть сообщение
Кто-то может еще предложить способ сравнения внутри условия таких чисел как 0.15 и 0.13+0.02
Только троечник может предложить такой способ сравнения вещественных чисел!
Цитата Сообщение от qad_quolo Посмотреть сообщение
Massaraksh7, да, я уже почитал про вещественные числа...
Плохо читал.
Меняй свой алгоритм. Для такого сравнения двух вещественных чисел можно применять только >= или <=
Цитата Сообщение от qad_quolo Посмотреть сообщение
теперь strto100x('0,15') > strto100x('0,13') + 2 сравнивает правильно
Ну это только вчера вечером, когда соседка с первого этажа легла спать вовремя, а сосед с третьего этажа пришел домой трезвым.
0
1 / 1 / 1
Регистрация: 06.05.2017
Сообщений: 60
08.07.2017, 05:03  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
Ну это только вчера вечером, когда соседка с первого этажа легла спать вовремя, а сосед с третьего этажа пришел домой трезвым.
а в каких случаях эта функция может не сработать?
0
 Аватар для Matan!
1882 / 1016 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
08.07.2017, 10:31
Я так понял, что эта программа не будет воспринимать отрицательные числа, да и сравнивать только числа формата 0.00f.
Да?
По хорошему после ввода числа можно устанавливать DecimalSeparator на '.'
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 12
08.07.2017, 11:15
qad_quolo,
Delphi
1
2
3
4
5
6
7
8
9
10
uses Math;  // для Delphi 7..XE, для XE2+ тут будет System.Math
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  edit1.Text := '0,15';
  edit2.Text := '0,13';
 
  if CompareValue(strtofloat(edit1.text), strtofloat(edit2.text) + 0.02) > 0 then
    showmessage('bolshe') else showmessage('ne bolshe');
end;
0
1 / 1 / 1
Регистрация: 06.05.2017
Сообщений: 60
09.07.2017, 05:47  [ТС]
Цитата Сообщение от Matan! Посмотреть сообщение
Я так понял, что эта программа не будет воспринимать отрицательные числа, да и сравнивать только числа формата 0.00f.
Отрицательные числа мне сравнивать не нужно.
Вся проблема как раз в том чтобы узнать больше или меньше число 0,15 чем 0,13 + x (и если x = 0,02 то хотелось бы получать от программы в ответ что они равны,как в учебнике математики за 5 класс, но этого не происходит)
пробовал менять decimalseparator на точку - не помогло

Цитата Сообщение от Jin X Посмотреть сообщение
uses Math; *// для Delphi 7..XE, для XE2+ тут будет System.Math
Попробовал, но все равно выдает неравенство
0
500 / 356 / 231
Регистрация: 29.03.2015
Сообщений: 675
09.07.2017, 06:19
0.001 - ошибка точности при сравнении.
Код:
Delphi
1
2
3
4
5
6
7
procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.Text := '0,15';
edit2.Text := '0,13';
if abs(strtofloat(edit1.text)-(strtofloat(edit2.text) + 0.02))>0.001 then
showmessage('bolshe') else showmessage('ne bolshe');
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.07.2017, 06:19
Помогаю со студенческими работами здесь

Access violation при сравнении изображений
делаю программу для сравнения изображений перевожу в битмапы и потом смотрю по цвету пикселя картинки одного размера вот код ...

Найти ошибку при сравнении файлов
Помогите,пожалуйста найти ошибку. По заданию надо описать логическую функцию eq(f,q),проверяющая на равенство файлы f и g. Файлы типа type...

При сравнении строк компилятор выдает ошибки, в чем может быть косяк? Заранее признателен
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,...

StrToFloat
Прошу помощи! Устройство по RS сбрасывает данные на компьютер. Далее череда обработки. Получается что переодически приходят битые...

StrToFloat
День добрый! Подскажите пожайлуста: TData = record ID: String; //ИД станции Name : String; YEAR: Integer; //год...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru