Как округлять до целых (проблема с Round)

Федор_Федор

У меня почему-то получается такая вот ерунда:Round(0.5)=0;неверноRound(1.5)=2;Round(2.5)=2;неверноRound(3.5)=4;Подскажите, пожалуйста, в чем может быть дело и как можно округлять до целых правильно?Я уже поискал на форумах, нашел, что проблема есть, но не нашел как решать :-(
18 ответов

Федор_Федор


Федор_Федор

У меня почему-то получается такая вот ерунда:
Абсолютно правильное банкирское округление. Хочешь иметь другое - играйся с флагами FPU.


Федор_Федор

Тынц
Самое интересное, что перед тем, как писать вопрос, я прочил уже сообщения этого "топика" :-)Все равно не понял. Голова уже не соображает. Нужно применять эту хитрую функцию, предварительно начитавшись о ней в Гугле? Или есть более простой способ?Почему округление Round происходит до ближайшего четного, а не по правилам округления?


Федор_Федор

Абсолютно правильное банкирское округление. Хочешь иметь другое - играйся с флагами FPU.Posted via ActualForum NNTP Server 1.3
Я не в курсе. Банкирское округление - это когда в случае значащей цифры 5 округление производится в сторону четного числа?Ну, то есть, например, округлим до трех после запятой1.1115=1.1121.1125=1.112Это и есть "банкирское округление"?


Федор_Федор

Почему округление Round происходит до ближайшего четного, а не по правилам округления?
Потому что "до ближайшего чётного" - такое же правило округления, ничем не хуже "математического".


Федор_Федор

Потому что "до ближайшего чётного" - такое же правило округления, ничем не хуже "математического".
Да, наверное ничем не хуже. Но у меня из-за него не работает подпрограмма. Потому что там все рассчитано на математическое округление...Я "нацарапал" такую подпрограммулину, для моего случая (когда надо округлять только до целых).
<b>Function</b> RoundMath(x:Real):Integer;
<b>Begin</b>
 Result:=Round(x);
 <b>If</b> Trunc(x*<b>10</b>) <b>mod</b> <b>5</b> = <b>0</b> <b>then</b> <i>//Первая цифра после запятой - пятерка. С ней проблемы</i>
 <b>If</b> Trunc(x) <b>mod</b> <b>2</b> = <b>0</b> <b>then</b> <i>//Целая часть числа - четное число, с ним проблемы</i>
 Result:=Round(x)+<b>1</b>;
<b>End</b>;
Вроде работает... :-)


Федор_Федор

Абсолютно правильное банкирское округление. Хочешь иметь другое - играйся с флагами FPU.Posted via ActualForum NNTP Server 1.3
Хочу другое. :-)Подскажите, пожалуйста, как и где нужно "поиграться с флагами FPU", если не трудно...Я даже не знаю, что это за FPU...


Федор_Федор

Я даже не знаю, что это за FPU...
Ну так открой справку и почитай.


Федор_Федор

Федор_Федор wrote:> Я даже не знаю, что это за FPU...Не знаешь - не трогай .


Федор_Федор

<b>function</b> SRound(<b>const</b> Value: Extended): Extended;
<b>begin</b>
 <b>if</b> Value < <b>0</b> <b>then</b>
 Result := Trunc(AValue - <b>0</b>.<b>5</b>)
 <b>else</b>
 Result := Trunc(AValue + <b>0</b>.<b>5</b>);
<b>end</b>;


Федор_Федор

<b>function</b> SRound(<b>const</b> Value: Extended): Extended;
<b>begin</b>
 <b>if</b> Value < <b>0</b> <b>then</b>
 Result := Trunc(AValue - <b>0</b>.<b>5</b>)
 <b>else</b>
 Result := Trunc(AValue + <b>0</b>.<b>5</b>);
<b>end</b>;
Спасибо всем за помощь. Моя корявая функция, приведенная выше заработала.Чисто из интереса пытался понять, как работает ваша функция, приведенная выше. Не понял.Почему в одном месте Value, а в другом - AValue? Это ведь не опечатка?


Федор_Федор

Result := Trunc(X) + Trunc (Frac(X) * 2);


Федор_Федор

Почему округление Round происходит до ближайшего четного, а не по правилам округления?
Тебя неправильно учили, на самом деле количество округление больше двух.


Федор_Федор

на самом деле количество округление больше двух.
И это только "общепринятых". А ещё отбрасывать знаки можно по собственным правилам :)


Федор_Федор

Конечно не опечятка. Это тайная магия игры с флагами FPU. (Флаг А в данном случае) .


Федор_Федор

Конечно не опечятка. Это тайная магия игры с флагами FPU. (Флаг А в данном случае) .
Нет бы написать, что за флаги, да что делается в функции...


Федор_Федор

Почему в одном месте Value, а в другом - AValue? Это ведь не опечатка?
Это опечакка


Федор_Федор

Нет бы написать, что за флаги
Флаги описаны в инструкции по процессорам Интел, брать на одноименном сайте.