Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-24892
alxx
2002-12-25 17:07
2003.01.09
Курсы вылют


1-24878
b-Ars
2002-12-27 14:04
2003.01.09
Возможно ли сделать оптимальней?


1-24865
msgipss
2002-12-26 13:59
2003.01.09
А как можно присвоить один типизированный массив другому


1-24840
Alathorne
2002-12-27 14:13
2003.01.09
RXLib For


1-24907
Сергей Макаров
2002-12-25 18:13
2003.01.09
Работа с gif и подобными форматами.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский