Главная страница
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.021 c
15-1199143638
korneley
2008-01-01 02:27
2008.02.10
Незатребованные ARP - пакеты


9-1166964532
nordic3
2006-12-24 15:48
2008.02.10
Рисование в Image


2-1200405331
Danil
2008-01-15 16:55
2008.02.10
как увеличить скорость при работе с TMemoryStream


15-1200056094
Elec3C
2008-01-11 15:54
2008.02.10
Рейтинг языков прог-ния


15-1200021355
Slider007
2008-01-11 06:15
2008.02.10
С днем рождения ! 11 января 2008 пятница