![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как округлить число? [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;