![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
не пойму, что делает функция Round... [D5, D6, Win95/98]
BillyJeans © (2002-12-25 14:27:00)не пойму, что делает функция Round...
По описанию должна округлять, что она и делает, но делает она это весьма странно:
Round(0.5) = 0
Round(1.5) = 2
Round(2.5) = 2
Round(3.5) = 4
Round(4.5) = 4
Объясните мне пожалуйста что это, и что мне сделать, чтобы получить следующее:
Round(0.5) = 1
Round(1.5) = 2
Round(2.5) = 3
Round(3.5) = 4
Round(4.5) = 5
???
DJ_Sedoy (2002-12-28 01:15:00) [1]Попробовал - все верно округляет.
Может меня и не правильно в школе учат, но при
n.5 мы смотрим - если n четное, то в меньшую сторону, если нечетное, то в большую.
Anatoly Podgoretsky (2002-12-27 15:47:00) [2]Уже округлились
murzikN (2002-12-27 15:36:00) [3]предложение принимается, уже побежали.
AlexT1000 (2002-12-27 14:58:00) [4]вношу предложение всем округлиться в нужную сторону и сходить за водкой. иначе не разобраться
Alexander1966 (2002-12-27 14:00:00) [5]Вот пример на CBuilder++
float Round(float v,int prec)
{
bcd a=bcd(double(v),prec);
float aa=real(a);
return aa;
}
Смысл в том что тип bcdокругляется арифметически
Anatoly Podgoretsky (2002-12-27 09:48:00) [6]Вообще округлений много
1. в большую сторону (.x) ceil
2. в меньшую сторону (.x) floor
3. в большую сторону (.5) традиционное, щкольно-бытовое (old round)
4. до четного (.5) банковское (current round)
5. до нечетного (.5) анти-банковское
Есть возмоожности управления, через контрольное слово процессора
MBo (2002-12-27 06:47:00) [7]>Kair (26.12.02 22:50)
> Объясняю, что делает Round (для тех, кто не знает).
Для тех, кто не знает, надо все-таки объяснять правильно.
http://www.delphikingdom.com/helloworld/reals.htm
Если хочется, чтобы 0.5=>1, 1.5=>2, -0.5=>-1, -1.5=>-2
то подойдет:
function SuperRound(X:extended):Integer;
begin
if X>=0 then
Result:=Trunc(X+0.5)
else
Result:=Trunc(X-0.5)
end;
Если же -n.5 должно округляться к большему целому, то достаточно первой ветви
Kair (2002-12-26 22:50:00) [8]Объясняю, что делает Round(для тех, кто не знает).
Round округляет до ближайшего целого числа. Например,
Round(2.1) = 2
Round(2.2) = 2
Round(2.4999) = 2
Round(2.5001) = 3
Round(2.6) = 3
Round(2.9) = 3
Ответ на то, почему
Round(0.5) = 0
Round(1.5) = 2
Round(2.5) = 2
Round(3.5) = 4
Round(4.5) = 4
Возьмём, к примеру, число 2.5 оно может быть принято как 2,499999 (или 2,500001)
(что и происходит).
Если округлять 2.49999 (или 2.500001) вручную (школьный курс), то получается 2.5.
Но, так как 2.49999 ближе к 2, то и получается, что
Round(2.5) = 2.
(Кстати, Round(2.5) = 3 тоже иногда выходит).
BillyJeans (2002-12-26 17:13:00) [9]в Delphi 7 нашел функцию SimpleRoundTo, которая округлила правильно.... а вот у меня в 5й её нет :(((
Mike Kouzmine (2002-12-26 15:29:00) [10]Rounds a floating-point value to a specified digit or power of ten using “Banker’s rounding”.
Unit
Math
Category
Arithmetic routines
type TRoundToRange = -37..37;
function RoundTo(const AValue: Double; const ADigit: TRoundToRange): Double;
Description
Call RoundTo to round AValue to a specified power of ten.
AValue is the value to round.
ADigit indicates the power of ten to which you want AValue rounded. It can be any value from –37 to 37 (inclusive).
RoundTo uses “Banker’s Rounding” to determine how to round values that are exactly midway between the two values that have the desired number of significant digits. This method rounds to an even number in the case that AValue is not nearer to either value.
The following examples illustrate the use of RoundTo:
Expression Value
RoundTo(1234567, 3) 1234000
RoundTo(1.234, -2) 1.23
RoundTo(1.235, -2) 1.24
RoundTo(1.245, -2) 1.24
Note: The behavior of RoundTo can be affected by the Set8087CW procedure or SetRoundMode function.
jee (2002-12-26 15:15:00) [11]Народ, классическое округление (как в школе) можно получить так: прибавить к числу 0.5 и отбросить остаток. Это для положительных чисел.
Vit@ly (2002-12-26 13:03:00) [12]4 Anatoly Podgoretsky
Понял, мне казалось. что по ней общение удобней (оперативней) и хлеба не просит когда загружена. Кроме прочего конфидециальность от форума в случае глупых вопросов и ответов. Ну да ладно.
Anatoly Podgoretsky (2002-12-26 12:57:00) [13]А зачем я должен быть в какой то аське, мне ее и в телепрограммах с лихвой хватает, если ты про ICQ есть лежит есть не просит, даже несколько номером на протяжении многих лет.
Vit@ly (2002-12-26 12:54:00) [14]2 Anatoly Podgoretsky
Впечатление, что в инете круглосуточно, а в аське не наблюдаю. Не похоже, что invisible?
Anatoly Podgoretsky (2002-12-26 12:49:00) [15]Борланд рекомендует использовать следующию формулу
function RoundUp(X: Extended): Extended;
begin
Result := Trunc(X) + Trunc (Frac(X) * 2);
end;
Просто правда :-)
Vit@ly (2002-12-26 12:47:00) [16]Что необходимо получить?
Round(0.5)= 1 ???
Round(-0.5)= -1 ???
Уточните? Или что-то другое?
BillyJeans (2002-12-26 12:29:00) [17]Уважаемый Vit@ly ты наверное забыл прочитать вопрос!!!
Round(0.5) и Round(-0.5) даст нам 0!!!
а если для тебя это не проблема, то тебя никто не спрашивал!!!
Vit@ly (2002-12-26 11:59:00) [18]> ALL (в том числе и BillyJeans)
Давайте уточнимся. Что хочет получить от
Round(0.5)и
Round(-0.5) наш уважаемый BillyJeans
ИМХО - это не проблема, подскажем и закроем тему, кто раньше, кто позже не принципиально
BillyJeans (2002-12-26 10:37:00) [19]... и всеже как выглядит функция, которая производит математическое округление?
Johnmen (2002-12-26 10:32:00) [20]>BillyJeans ©
Существует математическое округление и банковское(бухгалтерское).
Round - банковское. Нужно для того, чтобы минимизировать погрешности округления при массовом суммировании.