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

Вниз

Округление   Найти похожие ветки 

 
NickBat ©   (2003-04-02 17:36) [40]

Ухх..
Пусть есть число: 14.34
В компьютере оно может храниться как 14.339999999999, но отражаться на экране оно будет как 14.34!!
Если попробывать отбросить третий знак после запятой, то получим на выходе 14.33 - вот и вся математика.


 
UDS   (2003-04-02 18:59) [41]

Ну и навертели!!! Я всегда использую самый простой и быстрый способ:

(round(rez*10)/10) // rez-это значение(real),которое округляем до десятых
(round(rez*100)/100) // до сотых
(round(rez*1000)/1000) // до тысячных

и т.д.
а может я не правильно понял вопрос?


 
Style   (2003-04-03 08:24) [42]

NickBat © >>
Я же делаю Ceil округление в большую сторону.
поэтому если число 13.4499999 получиться 13.45..

Но вот если после запятой 2 знака а округляем до 10000 тысячных
тут могут возникнуть проблеммы.
Поэтому нужно отделять целую часть от дробной.


 
Style   (2003-04-03 09:09) [43]

Вот так все отлично работает!

function FlRound(Fl: double; M: Integer): double;
var
z,i: integer;
f: double;
begin
z := 1;
for i:= 1 to M do
z:= z * 10;

f := fl*z;
f := Ceil(f);

Result := f / z;
end;

Проблемма была в следующем фунцкция Ceil это
Result := integer(trunc(x));
If(Frac(x) > 0) then Inc(Result);

Входной параметр trunc - это Extended т.е. если
мы пишем
Ceil(3.77 * 100) то получиться 388. т.е. в Extended появляеться Frac часть и Count возрастает

а если вычисление проводить в отдельной переменной типа Double
то ответ получаеться правильным!



 
Style   (2003-04-03 10:02) [44]

А если нужны большие число то вот так :)

Народ у меня все работает если и 1,999999999 и 1,0000000000001
все округляет вродеправильно посмотрите

function FlRound(Fl: double; M: Integer): double;
var
a,z,i: integer;
j,f: double;
s : string;
begin
z := 1;
for i:= 1 to M do
z:= z * 10;
a := trunc(int(fl));
j := Frac(Fl);
f := j*z;
s := floattostr(f - trunc(Int(f)));
if(s[1] = "0") then
f := Ceil(f);
f := f / z;

if(trunc(int(f)) > 0) then Inc(a);
Result := a + f;
end;


 
Style   (2003-04-03 10:40) [45]

Вот как можно )

function FlRound(Fl: double; M: Integer): double;
var
d : double;
begin
d := intpower(10,M);
if(Fl>0) then
result := Round(fl * d + 0.5) / d else
result := Round(fl * d - 0.5) / d;
end;


 
phantom2040 ©   (2003-04-08 11:59) [46]

Я как-то бился с округлением, вот что я выйскал, в D7 есть функция, RoundTo округляет по мат правилам, но на его работу влияет функция SetRoundMode, SetRoundMode(const RoundMode: TFPURoundingMode): TFPURoundingMode;
ее постоянные
rmNearest
rmDown это в меньшую сторону
rmUp это в большую сторону
rmTruncate
причем при значении rmUp округляется все в большую сторону даже если 3 знак =1


 
Silver_   (2003-04-08 12:10) [47]

RoundTo(a+0.001,-2);

результат должен быть:
1.111 = 1.11
1.144 = 1.14
1.145 = 1.15
1.149 = 1.15

думаю то что надо (писал прямо здеся (не проверял) но должно работать)



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

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

Наверх




Память: 0.54 MB
Время: 0.013 c
14-54838
hatchy
2003-03-31 10:25
2003.04.17
Браузер глючит....


1-54625
АлеКо
2003-04-08 02:58
2003.04.17
Выделить подстроку.


14-54861
Leran2002
2003-04-01 20:57
2003.04.17
Ты скажи ну хто его придумал... :((


1-54730
PrettyFly
2003-04-05 14:08
2003.04.17
Internal error: URW3950


3-54410
Veles
2003-04-01 13:58
2003.04.17
передача из sql в dbf