Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как округлить число? [D3, Win95/98]


SunVit ©   (2002-06-11 00:37:00) 

Как округлить real число (без Round)?
Пример: 123,123
Ответ: 123,12


KilkennyCat   (2002-06-11 21:24:00) [1]

To Skyle :

Это ведь шутка была, хоть и работающая :)
Но в каждой шутке... Иногда такие альтернативные методы очень помогают. А вообще, я сейчас подумаю об умножении...


АК-74   (2002-06-11 18:21:00) [2]

Я догадываюсь, что нет предела совершенству.
Но куда подевался автор вопроса? Ведь задача так и не ясна...
Кстати, когда неверно?


Johnmen   (2002-06-11 17:13:00) [3]

>АК-74 (11.06.02 16:44)

Не всегда верно....:()


АК-74   (2002-06-11 16:44:00) [4]

Учтем отбрасываемую цифру:

function MyRound(n: Real; z: Integer): Real;
var
Mult: Extended;
begin
Mult := IntPower(10,z);
result := Int((n+0.5/Mult)*Mult)/Mult;
end;


Johnmen   (2002-06-11 12:44:00) [5]

>Nicolas_ (11.06.02 12:28)
>y := (trunc((x + 0.005) * 100)) / 100

Не всегда верно....:()


Skyle   (2002-06-11 12:28:00) [6]


> Гы... а я вот как придумал! без роунда! только код писать
> лень, но тема будет понятна:

и т.д...
Короче, это примерно то же самое, что микроскопом гвозди забивать... Есть гораздо более подходящие идеи по этому поводу... А это... Размах не тот...
А если тебе так нравится математические операции через строки, то попробуй посчитать 1 000 000!, может надоедят...:))))


Nicolas_   (2002-06-11 12:28:00) [7]

IB: попробуй округлить, например, 0.48 до 1 знака.

SunVit: y := (trunc((x + 0.005) * 100)) / 100


kaif   (2002-06-11 11:26:00) [8]

>2 Johnmen © (11.06.02 10:12)
Внимательно не смотрел. Скорее это просто идея. Если под D3 разрядности не хватит, все равно нужно будет менять алгоритм.
Можно, например, разбить на целую и дробную части:
int_part := int(a);
frac_part := frac(a);
и потом что-то предпринять по округлению (с кучей if-ов).
Пусть это длинно, но работать будет быстро (если это требуется). До сих пор не ясен мотив, почему round отвергнут. Может, это прояснило бы дело...


Johnmen   (2002-06-11 10:12:00) [9]

>kaif © (11.06.02 02:24) : Не всегда верно....:()


KilkennyCat   (2002-06-11 06:16:00) [10]

Гы... а я вот как придумал! без роунда! только код писать лень, но тема будет понятна:

Делаем сначала FloatToStr, ищем позицию запятой, копируем в новую строку с начала до одного символа после запятой, в старой строке смотрим третий символ после запятой и если его Ord() меньше чем Ord("5"), то к новой строке прибавляется символ, равный третьему после запятой символу старой строки, иначе к новой строке прибавляется сhr(inc(ord(второй символ после запятой старой строки))).
Ну и СтрТуФлот полученное

Как вам математические операции через строки и коды символов?


kaif   (2002-06-11 02:24:00) [11]

if frac(a) >= 0.005 then
Result := trunc(a*100)/100 + 0.01
else
Result := trunc(a*100)/100

Правда, в D3 trunc не in64 возвращает, а integer.
Поэтому в D3 это будет работать только с небольшими числами.


IB   (2002-06-11 02:09:00) [12]

Стандартную где?
Да и ведь сказано: без Round.


drpass   (2002-06-11 02:02:00) [13]

А стандартную функцию RoundTo не проходили?


IB   (2002-06-11 01:46:00) [14]

MyRound(0.02,-1) = 0
MyRound(0.02,0) = 0
MyRound(0.02,1) = 0
MyRound(0.02,2) = 0.02
MyRound(0.02,3) = 0.02


Anatoly Podgoretsky   (2002-06-11 01:30:00) [15]

Попробуй округлить 0,02


IB   (2002-06-11 01:06:00) [16]

function MyRound(n: Real; z: Integer) :Real;
begin
result := Int(n*IntPower(10,z))/IntPower(10,z);
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо