Форум: "Основная";
Текущий архив: 2003.01.09;
Скачать: [xml.tar.bz2];
Внизне пойму, что делает функция Round... Найти похожие ветки
← →
BillyJeans (2002-12-25 14:27) [0]не пойму, что делает функция 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
???
← →
Кулюкин Олег (2002-12-25 14:46) [1]Round(X + 0.5) или Ceil из юнита Math
← →
Kair (2002-12-25 15:53) [2]Trunc(x)+1
← →
Anatoly Podgoretsky (2002-12-25 16:00) [3]Kair (25.12.02 15:53)
Новое слово в математике?
Попробуй для 0,3
← →
Ipx (2002-12-25 16:05) [4]2 Kair
А если Trunc(0.55)+1,
что тогда получим?, скорее всего 2 -:(((
← →
Anatoly Podgoretsky (2002-12-25 16:08) [5]Ipx © (25.12.02 16:05)
А ты попробуй прежде чем смеяться, хорошо смеется тот кто смеется последний
← →
Mike Kouzmine (2002-12-25 16:42) [6]RoundTo
← →
Ipx (2002-12-25 16:47) [7]4 Anatoly Podgoretsky
В предыдущем своем ответе не заметил, что вместо Round, появилось Trunc. Здесь всего-навсего нужно помнить, что Round возвращает Real, а Trunc - Integer.
← →
alxx (2002-12-25 17:13) [8]Не, ну Trunc(0.1)+1 определенно не возвращает округленного числа.
← →
BillyJeans (2002-12-25 17:25) [9]4 Колюкин Олег
функция Ceil округляет до целого в большую сторону, т.е. Ceil(1.1) = 2! Что противоречит понятиям об округлении :((
Хотя Round(X + 0.5) должно помочь...
← →
BillyJeans (2002-12-26 08:53) [10]Мда, что-то я погоречился с Round(X + 0.5)....
потому, как Round(0.3 + 0.5) не даст мне 0!
Неужели никто не сталкивался с округлением, или всем без разницы, как там округляется?
← →
PKT (2002-12-26 09:14) [11]Понимаю, что это не есть хорошо,
но округляю так:
Round(Число + e);
где е - число, заведомо меньшее применяемой в расчетах точности
Ну, что-то вроде 0.000000000001
← →
Кулюкин Олег (2002-12-26 09:15) [12]2 BillyJeans © (26.12.02 08:53)
Trunc(X + 0.5)
← →
PKT (2002-12-26 09:22) [13]Кстати, ничего странного Round не делает.
В Help-е же сказано, if X is exactly halfway between two whole numbers, the result is always the even number.
То есть до ближайшего четного.
← →
Anatoly Podgoretsky (2002-12-26 09:40) [14]BillyJeans © (26.12.02 08:53)
В этот не погорячился, даст именно 1
А вот для случая -0,3 + 0,5 или -0,6 + 0,5
Такие вещи надо делать с учетом знака
← →
BillyJeans (2002-12-26 09:44) [15]4 PKT
и что же это за округление такое, зачем оно нужно?
чему нас в школе учат, разве этому?
мне нужно нормальное, человеческое округление....
← →
Anatoly Podgoretsky (2002-12-26 09:55) [16]Ну знаешь, есть предположения, что вас в школе учат не тому.
← →
Johnmen (2002-12-26 10:32) [17]>BillyJeans ©
Существует математическое округление и банковское(бухгалтерское).
Round - банковское. Нужно для того, чтобы минимизировать погрешности округления при массовом суммировании.
← →
BillyJeans (2002-12-26 10:37) [18]... и всеже как выглядит функция, которая производит математическое округление?
← →
Vit@ly (2002-12-26 11:59) [19]> ALL (в том числе и BillyJeans)
Давайте уточнимся. Что хочет получить от
Round(0.5)и
Round(-0.5) наш уважаемый BillyJeans
ИМХО - это не проблема, подскажем и закроем тему, кто раньше, кто позже не принципиально
← →
BillyJeans (2002-12-26 12:29) [20]Уважаемый Vit@ly ты наверное забыл прочитать вопрос!!!
Round(0.5) и Round(-0.5) даст нам 0!!!
а если для тебя это не проблема, то тебя никто не спрашивал!!!
← →
Vit@ly (2002-12-26 12:47) [21]Что необходимо получить?
Round(0.5)= 1 ???
Round(-0.5)= -1 ???
Уточните? Или что-то другое?
← →
Anatoly Podgoretsky (2002-12-26 12:49) [22]Борланд рекомендует использовать следующию формулу
function RoundUp(X: Extended): Extended;
begin
Result := Trunc(X) + Trunc (Frac(X) * 2);
end;
Просто правда :-)
← →
Vit@ly (2002-12-26 12:54) [23]2 Anatoly Podgoretsky
Впечатление, что в инете круглосуточно, а в аське не наблюдаю. Не похоже, что invisible?
← →
Anatoly Podgoretsky (2002-12-26 12:57) [24]А зачем я должен быть в какой то аське, мне ее и в телепрограммах с лихвой хватает, если ты про ICQ есть лежит есть не просит, даже несколько номером на протяжении многих лет.
← →
Vit@ly (2002-12-26 13:03) [25]4 Anatoly Podgoretsky
Понял, мне казалось. что по ней общение удобней (оперативней) и хлеба не просит когда загружена. Кроме прочего конфидециальность от форума в случае глупых вопросов и ответов. Ну да ладно.
← →
jee (2002-12-26 15:15) [26]Народ, классическое округление (как в школе) можно получить так: прибавить к числу 0.5 и отбросить остаток. Это для положительных чисел.
← →
Mike Kouzmine (2002-12-26 15:29) [27]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.
← →
BillyJeans (2002-12-26 17:13) [28]в Delphi 7 нашел функцию SimpleRoundTo, которая округлила правильно.... а вот у меня в 5й её нет :(((
← →
Kair (2002-12-26 22:50) [29]Объясняю, что делает 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 тоже иногда выходит).
← →
MBo (2002-12-27 06:47) [30]>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 должно округляться к большему целому, то достаточно первой ветви
← →
Anatoly Podgoretsky (2002-12-27 09:48) [31]Вообще округлений много
1. в большую сторону (.x) ceil
2. в меньшую сторону (.x) floor
3. в большую сторону (.5) традиционное, щкольно-бытовое (old round)
4. до четного (.5) банковское (current round)
5. до нечетного (.5) анти-банковское
Есть возмоожности управления, через контрольное слово процессора
← →
Alexander1966 (2002-12-27 14:00) [32]Вот пример на CBuilder++
float Round(float v,int prec)
{
bcd a=bcd(double(v),prec);
float aa=real(a);
return aa;
}
Смысл в том что тип bcd округляется арифметически
← →
AlexT1000 (2002-12-27 14:58) [33]вношу предложение всем округлиться в нужную сторону и сходить за водкой. иначе не разобраться
← →
murzikN (2002-12-27 15:36) [34]предложение принимается, уже побежали.
← →
Anatoly Podgoretsky (2002-12-27 15:47) [35]Уже округлились
← →
DJ_Sedoy (2002-12-28 01:15) [36]Попробовал - все верно округляет.
Может меня и не правильно в школе учат, но при
n.5 мы смотрим - если n четное, то в меньшую сторону, если нечетное, то в большую.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.01.09;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.007 c