Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.10;
Скачать: CL | DM;

Вниз

сравнение чисел   Найти похожие ветки 

 
VladSel   (2008-01-16 03:59) [0]

Помогите разобраться !!!
задача: имея число (real) r:=123.456; и количество знаков после запятой 3, передать их в функцию GetValue, которая это сделает (делаю это в функции для того чтобы проверять всевозможные условия этого значения) и вернёт полученное значение.
Функцию написал, пробую проверить работу if r<>123.456 then, а результат не понятный, в дебаггере показывает одинаковые значения, при этом считает их разными. Для округления использую SimpleRoundTo а не round потому, что round работает не корректно.

procedure TForm1.Button1Click(Sender: TObject);
var r:real;
 value:variant;
 function GetValue(value:variant; digit:integer):variant;
 var r:real;
 begin
   r:=SimpleRoundTo(value,-digit);
   Result:=r;
 end;
begin
 r:=123.456;
 if r=0 then r:=0;
 value:=r;
 r:=GetValue(value,3);
 if r<>123.456 then
   r:=0;
 if r=0 then r:=0;
end;


 
Riply ©   (2008-01-16 04:06) [1]

> [0] VladSel   (16.01.08 03:59)
> Помогите разобраться !!!
Попробуй, сначала, привести код в порядок.
Я, например, путаюсь где какая r.
И еще не поятно, что происходит в строках тиап if r=0 then r:=0;


 
VladSel   (2008-01-16 04:34) [2]

procedure TForm1.Button1Click(Sender: TObject);
var r:real;
value:variant;

function GetValue(value:variant; digit:integer):variant;
var r1:real; //эта переменная чтобы значение записанное в результат имело тип real
begin
  r1:=SimpleRoundTo(value,-digit); //сдесь округлил на сколько надо
//..
//..
  Result:=r1; //записал полученное значение в результат
end;

begin
r:=123.456; //присвоил нужное значение
if r=0 then r:=0; //это чтобы Delphi ничего не оптимизировал
r:=GetValue(r,3); //получаю новое значение (полученное функцией)
if r<>123.456 then //а вот здесь надо остановиться в дебаггере (там сравниваемые значения показываются одинаково)
  r:=0; //а сюда я вообще не должен попасть, т.к. значения должны быть равны, но почему-то попадаю
if r=0 then r:=0; //это чтобы Delphi ничего не оптимизировал
end;


 
VladSel   (2008-01-16 04:38) [3]

более просто:

 r:=123.456;
 r:=round(r*1000)/1000;
 if r<>123.456 then
   r:=0; //сюда зайти не должен а захожу


 
VladSel   (2008-01-16 04:56) [4]

все разобрался, дело п преобразовании типов


 
Anatoly Podgoretsky ©   (2008-01-16 08:37) [5]

> VladSel  (16.01.2008 04:56:04)  [4]

Дело не в нем, а в особенностях веществественных с ПЛАВАЮЩЕЙ ЗАПЯТОЙ.

> имея число (real) r:=123.456; и количество знаков после запятой 3

это попахивает абсурдом, число с ПЛАВАЮЩЕЙ ЗАПЯТОЙ и не тебе решать сколько знаков будет после запятой.
Марш за учебниками или хотя бы на Королевство Дельфи за статьей.


 
Григорьев Антон ©   (2008-01-16 08:44) [6]

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374



Страницы: 1 вся ветка

Текущий архив: 2008.02.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.023 c
2-1200559885
owa
2008-01-17 11:51
2008.02.10
Как записать данные в реестр в формате REG_BINARY


15-1199560136
kuvalda
2008-01-05 22:08
2008.02.10
Сгорела материнка?


8-1173263139
homm
2007-03-07 13:25
2008.02.10
Geometrical Pen


15-1199938997
Interfer0n
2008-01-10 07:23
2008.02.10
Ищем Delphi программиста


15-1199704189
Kerk
2008-01-07 14:09
2008.02.10
Скрытые модели Маркова