Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 15.08.2011, 11:07
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
SpectraL, так еще прикольней:
Код:
var
  a, b, c: Extended;
begin
  a:=212.53;
  b:=212.49;
  c:=a-b;
  Edit1.Text:=FloatToStr(c);
  Edit2.Text:=FloatToStr(0.04-c);
  if Abs(c-0.04)<1E-9 then ShowMessage('c=0.04');
end;
Edit1 = 0,04, а вот Edit2 = 6,105413483809E-18
красная строчка тебе в помощь!
Да, но выбирать Epsilon нужно с учётом требуемой точности.
Если человеку надо два знака после запятой, то и сравнивать надо не с 1E-9, а с 1E-2 или, на худой конец с 1E-3
Ответить с цитированием
  #17  
Старый 15.08.2011, 11:22
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от icWasya
выбирать Epsilon нужно с учётом требуемой точности.
естественно. я же не зря привел значение Edit2 = 6,105413483809E-18, а в сравнении E-9, дабы показать, что это не панацея и есть возможность выбора, ага)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #18  
Старый 15.08.2011, 11:37
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
По умолчанию

а я хочу чтобы переменной "с" присваивался наиболее правильный результат...
Ответить с цитированием
  #19  
Старый 15.08.2011, 13:13
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

А что, с точки зрения вещественных чисел в компьютере, более правильный результат?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #20  
Старый 15.08.2011, 13:23
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
По умолчанию

По видимому тот, что соответствует строковому представлению числа.
Ответить с цитированием
  #21  
Старый 15.08.2011, 15:18
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Тогда вам сюда, там в разделе Дельфи имеется большой топик с обсуждениями на эту тему и внятно обьясняется почему Вашим желаниям не суждено сбыться и как это обойти.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #22  
Старый 15.08.2011, 15:25
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
По умолчанию

Вы бы есчо ссылку на Google дали...

Последний раз редактировалось SpectraL, 15.08.2011 в 15:49.
Ответить с цитированием
  #23  
Старый 15.08.2011, 21:39
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от angvelem
... там в разделе Дельфи ...
Я указал в каком разделе искать, поиск работает нормально или мне поискать за вас? Я не помню ссылку так как видел достаточно давно.
P.S. Можно и в Google поискать.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #24  
Старый 16.08.2011, 09:49
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
По умолчанию

Да, поисчите пожалуйста...

Последний раз редактировалось SpectraL, 16.08.2011 в 10:07.
Ответить с цитированием
  #25  
Старый 16.08.2011, 12:48
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Ребят, а что вы тут за дискуссию развернули???

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  a, b, c: Double;
begin
  a:=212.53;
  b:=212.49;
  c:=a-b;
  c := round(c * 100 + 0.5) / 100;
  showmessage(floattostr(c));
end;
__________________
Google в помощь
Ответить с цитированием
  #26  
Старый 16.08.2011, 12:56
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Ildar-tsr
Ребят, а что вы тут за дискуссию развернули???
потому что:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  a, b, c: Double;
begin
  a:=212.053;
  b:=212.049;
  c:=a-b;
  c := round(c * 100 + 0.5) / 100;
  showmessage(floattostr(c));
end;
будет равно 0,01 а не 0,004
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #27  
Старый 16.08.2011, 13:01
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Достаточно вместо 100 подставить переменную, и вычислять максимальное количество знаков после запятой (у "a" и "b"). Циклом довести данную переменную до нужной цифры. Т.е. если после запятой одна цифра, то будет 10, если две - 100, три - 1000 и т.д.
__________________
Google в помощь
Ответить с цитированием
  #28  
Старый 16.08.2011, 13:24
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Ildar-tsr:

function IntPower(const Base: Extended; const Exponent: Integer): Extended;

Код:
unit Math;

function RoundTo(const AValue: Double; const ADigit: TRoundToRange): Double;
var
  LFactor: Double;
begin
  LFactor := IntPower(10, ADigit);
  Result := Round(AValue / LFactor) * LFactor;
end;

function SimpleRoundTo(const AValue: Double; const ADigit: TRoundToRange = -2): Double;
var
  LFactor: Double;
begin
  LFactor := IntPower(10, ADigit);
  Result := Trunc((AValue / LFactor) + 0.5) * LFactor;
end;

--

Код:
uses
  UMathServices,

  Memo1.Lines.Add(ulSub('212.53', '212.49'));
  Memo1.Lines.Add(ulSub('212.053', '212.049'));
  Memo1.Lines.Add(ulSub('212.4556565', '212.343676676'));
Вложения
Тип файла: rar UMathServices.rar (2.9 Кбайт, 2 просмотров)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:40.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025