Форум: "Основная";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
ВнизОкругление Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.01 c