Как разобраться с roundto в Delphi?
Помощь в написании контрольных, курсовых и дипломных работ здесь.
RoundTo, как работает округление?
Всем доброго времени суток помогите разобраться, я немного запутался, суть такова: Есть у меня.
Roundto
Здравствуйте. Смотрю в дебаггере на выполнение программы. Из-за того, что 0.1 в двоичной системе -.
roundto
из хелпа: RoundTo(1.235, -2) 1.24 RoundTo(1.245, -2) 1.24 написал проверил: RoundTo(1.235.
RoundTo
Ребята, подскажите, пожалуйста, есть ли ещё одна функция кроме RoundTo, а то она округляет как-то.
RoundTo — округление чисел
Почему не работает roundTo? procedure TForm1.Button1Click(Sender: TObject); begin a:=.
RoundTo возвращает результат с запятой, а нужна точка
Возвращает результат содержащий запятую, а нужно точку. Как можно сделать без изменений.
Delphi+OpenGL надо разобраться
Здравствуйте дорогие форумчане, сейчас учусь совмещать делфи и OpenGL хотя до сих пор я был знаком.
Помогите разобраться с Delphi Cltkfnm
Ребят, плиз помогите . 1) как сделать чтоб брался текст из edit , анализировался, в папке с.
Не могу разобраться с программой на delphi
Мне нужно составить программу вычисляющую формулу F(x)=3x^4-x^3 (вместо чисел могут стоять и.
Источник
Delphi roundto не работает
Подскажите как организовать округление чисел с заданой точностью в Delphi. Я сделал свою функцию основанную на round. Но у нее обнаружилась странная особенность.
Round(1.5) = 2, а Round(2.5)=2, тоже. Т.е. только 1.5 округляет до 2, а что больше (2.5, 3.5, и т.д.) округляет в меньшую сторону. Как сделать, чтобы округление 0.5 всегда шло в большую сторону.
← →
Думкин © ( 2005-03-01 13:44 ) [1]
> Round(1.5) = 2, а Round(2.5)=2, тоже. Т.е. только 1.5 округляет
> до 2, а что больше (2.5, 3.5, и т.д.) округляет в меньшую
> сторону.
Не верно.
If X is exactly halfway between two whole numbers, the result is always the even number. This method of rounding is often called «Banker’s Rounding».
← →
MU ( 2005-03-01 13:45 ) [2]
← →
Думкин © ( 2005-03-01 13:45 ) [3]
> Подскажите как организовать округление чисел с заданой точностью в Delphi.
А это RoundTo + F1
← →
АМБ ( 2005-03-01 13:47 ) [4]
Что не верно? Поясните.
SimpleRoundTo(4.145, -2) = 4.14
и
RoundTo(4.145, -2) = 4.14
т.е. 5 округляется в меньшую сторону, а как сделать, чтобы 5 округлялась в большую сторону?
← →
Думкин © ( 2005-03-01 14:20 ) [6]
> [4] АМБ (01.03.05 13:47)
> Что не верно? Поясните.
а что больше (2.5, 3.5, и т.д.) округляет в меньшую сторону.
If X is exactly halfway between two whole numbers, the result is always the even number. This method of rounding is often called «Banker’s Rounding».
← →
MU ( 2005-03-01 14:32 ) [7]
есть у меня такая ТУПАЯ и НЕКРАСИВАЯ функция, но она удовлетворила всем нашим требованиям.
function SRoundTo(const AValue: Extended; const ADigit: TRoundToRange = -2): Extended;
var wS : String;
V : Extended;
i, P, PGreat, S : Integer;
begin
S := Sign(AValue);
V := Abs(AValue);
wS := FormatFloat(«0.0000#», V);
P := Pos(«.», wS) — ADigit;
PGreat := P;
if (P + 1 1) then
if ws[P+1] > «4» then
repeat
if ws[P] = «.» then
Dec(P);
while ws[P] = «9» do
begin
wS[P] := «0»;
if P = 1 then
wS := «0» + wS
else
Dec(P);
if ws[P] = «.» then
Dec(P);
end;
if ws[P] <> «.» then
begin
wS[P] := Succ(wS[P]);
Break;
end;
until true;
for i := PGreat + 1 to Length(wS) do
if wS[i] <> «.» then ws[i] := «0»;
Result := S * StrToFloat(wS);
end;
← →
begin. end © ( 2005-03-01 14:52 ) [8]
> АМБ (01.03.05 13:57) [5]
> а как сделать, чтобы 5 округлялась в большую сторону?
См. в справке описание функции SetRoundMode.
← →
АМБ ( 2005-03-01 15:11 ) [9]
Устанавливаю: SetRoundMode(rmUp);
После этого программа выдает:
Round(17.345) = 17.36
.
> АМБ (01.03.05 15:11) [9]
Round возвращает целое число.
← →
MU ( 2005-03-01 15:15 ) [11]
← →
АМБ ( 2005-03-01 15:17 ) [12]
> begin. end © (01.03.05 15:15) [10]
Прошу прощения. Не правильно записал. Надо
round(1734.5) = 1736
а потом я еще и делю на коэфициент.
← →
begin. end © ( 2005-03-01 15:28 ) [13]
> АМБ (01.03.05 15:17) [12]
А надо 1735? Используйте RoundTo(1734.5, 0).
← →
АМБ ( 2005-03-01 16:29 ) [14]
Всем спасибо.
В результате получилось
MyFankRound := (SimpleRoundTo(N*R, 0))/R;
где N — округляемое число;
R — указатель точности округления. Правда не много не удобное. Если указываешь точность после запятой, то указываешь в целых величинах. Например, для точности до десятых, указываешь 10, до сотых — 100. А если надо округлять до целых десятков, то указываешь 0.1, до сотых — 0.01
Еще раз всем спасибо.
Я прочитал эту ветку попробовал RoundTo(1734.5, 0) = 1735, а вот RoundTo(123.125, -2) = 123.12. Так как в Delphi правильно округлить до, к примеру, 2-х знаков после запятой ? Кстати вот так работает правильно FormatFloat(«0.00», 123.125), но это же строки.
← →
Antonn © ( 2005-03-01 17:06 ) [16]
Sancho © (01.03.05 16:35) [15]
как вариант: умножать на 100, округлять, делить на 100, удалять знаки в дробной части(если больше 2х)
← →
mike-d © ( 2005-03-01 17:43 ) [17]
Since Delphi»s Round() function uses «bankers rounding» where the value is rounded to the nearest even number, how can I round a floating point number using the more traditional means, where fractional values less than .5 round down, and fractional values of .5 and greater round up?
The following function demonstrates rounding down numbers with fractional values of less than .5, and rounding up numbers with fractional values of .5 and greater.
function RoundUp(X: Extended): Extended;
begin
Result := Trunc(X) + Trunc (Frac(X) * 2);
end;
Источник
Delphi roundto не работает
Доброго времени суток!
Есть такая проблема:
Делаю
SetRoundMode(rmNearest);
RoundTo(123.345, -2)
причем, если передаю 1.245, то выдает 1.25
Может дело в том, что 123.345 он понимает как 123.3449999999999 и делает потом Trunc?
Как нормально округлить число? Писать свою функцию с использованием Round?
| От: | mlecter |
Дата: | 15.09.04 14:37 | |
Оценка: |
| От: | Diouzshev |
Дата: | 15.09.04 15:05 | |
Оценка: |
Hello, mlecter!
You wrote on Wed, 15 Sep 2004 13:57:07 GMT:
m> Делаю
m> SetRoundMode(rmNearest);
m> RoundTo(123.345, -2)
m> Получаю
m> 123.34
m> причем, если передаю 1.245, то выдает 1.25
m> Может дело в том, что 123.345 он понимает как 123.3449999999999 и
m> делает потом Trunc?
m> Как нормально округлить число? Писать свою функцию с использованием
m> Round?
Ого-го. Вот это да! Глюк у RoundTo на таких маленьких числах!
Помогло изменение функции RoundTo:
function RoundTo(const AValue: Extended <было Double>; const ADigit: TRoundToRange): Extended; <было Double>
var
LFactor: Extended; <было Double>
begin
LFactor := IntPower(10, ADigit);
Result := Round(AValue / LFactor) * LFactor;
end;
После изменений 1.245 стало округлять правильно — до 1.24 %)
Народ! У кого D7 скажите, этот глюк сохранился?
With best regards, Alexander Diouzshev-Maltsev.
| От: | Diouzshev |
Дата: | 15.09.04 15:07 | |
Оценка: |
Hello, mlecter!
You wrote on Wed, 15 Sep 2004 14:37:23 GMT:
m> Проблема в RoundMode
m> Если даже стоит rmNearest округление происходит банковским методом.
m> Можно ли округлять не банковским методом?
Можно!
Ручками. Но зачем?
With best regards, Alexander Diouzshev-Maltsev.
| От: | AMogil |
Дата: | 15.09.04 15:09 | |
Оценка: |
Здравствуйте, mlecter, Вы писали:
M>Доброго времени суток!
M>Есть такая проблема:
M>Делаю
M>SetRoundMode(rmNearest);
M>RoundTo(123.345, -2)
M>Получаю
M>123.34
M>причем, если передаю 1.245, то выдает 1.25
M>Может дело в том, что 123.345 он понимает как 123.3449999999999 и делает потом Trunc?
M>Как нормально округлить число? Писать свою функцию с использованием Round?
| От: | AMogil |
Дата: | 15.09.04 15:10 | |
Оценка: |
Здравствуйте, AMogil, Вы писали:
AM>Здравствуйте, mlecter, Вы писали:
M>>Доброго времени суток!
M>>Есть такая проблема:
M>>Делаю
M>>SetRoundMode(rmNearest);
M>>RoundTo(123.345, -2)
M>>Получаю
M>>123.34
M>>причем, если передаю 1.245, то выдает 1.25
M>>Может дело в том, что 123.345 он понимает как 123.3449999999999 и делает потом Trunc?
M>>Как нормально округлить число? Писать свою функцию с использованием Round?
AM>SimpleRoundTo?
AM>Алексей.
Она округляет до большего, т.е. для положительных чисел все делает как мы привыкли.
| От: | mlecter |
Дата: | 15.09.04 15:16 | |
Оценка: |
Здравствуйте, AMogil, Вы писали:
AM>>Алексей.
AM>Она округляет до большего, т.е. для положительных чисел все делает как мы привыкли.
AM>Алексей.
Не до большего, а до ближайшего четного.
1.345 -> 1.34
1.355 -> 1.36
«Мы» так не привыкли
| От: | mlecter |
Дата: | 15.09.04 15:19 | |
Оценка: |
Здравствуйте, AMogil, Вы писали:
AM>SimpleRoundTo?
AM>Алексей.
SimpleRoundTo(123.345, -2) = 123.34
RoundMode = rmNearest
| От: | AMogil |
Дата: | 15.09.04 15:31 | |
Оценка: |
Здравствуйте, mlecter, Вы писали:
M>Здравствуйте, AMogil, Вы писали:
AM>>>Алексей.
AM>>Она округляет до большего, т.е. для положительных чисел все делает как мы привыкли.
AM>>Алексей.
M>Не до большего, а до ближайшего четного.
M>1.345 -> 1.34
M>1.355 -> 1.36
M>»Мы» так не привыкли
Пример из справки Delphi
SimpleRoundTo(1234567, 3) 1234000
SimpleRoundTo(1.234, -2) 1.23 .
SimpleRoundTo(1.235, -2) 1.24
SimpleRoundTo(-1.235, -2) -1.23
SimpleRoundTo uses asymmetric arithmetic 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 always rounds to the larger value.
| От: | AMogil |
Дата: | 15.09.04 15:36 | |
Оценка: | 2 (1) |
Здравствуйте, AMogil, Вы писали:
AM>Здравствуйте, mlecter, Вы писали:
M>>Здравствуйте, AMogil, Вы писали:
AM>>>>Алексей.
AM>>>Она округляет до большего, т.е. для положительных чисел все делает как мы привыкли.
AM>>>Алексей.
M>>Не до большего, а до ближайшего четного.
M>>1.345 -> 1.34
M>>1.355 -> 1.36
M>>»Мы» так не привыкли
AM>Пример из справки Delphi
AM>Expression Value
AM>SimpleRoundTo(1234567, 3) 1234000
AM>SimpleRoundTo(1.234, -2) 1.23 .
AM>SimpleRoundTo(1.235, -2) 1.24
AM>SimpleRoundTo(-1.235, -2) -1.23
AM>И техт:
AM>SimpleRoundTo uses asymmetric arithmetic 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 always rounds to the larger value.
| От: | mlecter |
Дата: | 15.09.04 15:53 | |
Оценка: |
Здравствуйте, AMogil, Вы писали:
AM>>Пример из справки Delphi
AM>>Expression Value
AM>>SimpleRoundTo(1234567, 3) 1234000
AM>>SimpleRoundTo(1.234, -2) 1.23 .
AM>>SimpleRoundTo(1.235, -2) 1.24
AM>>SimpleRoundTo(-1.235, -2) -1.23
AM>>И техт:
AM>>SimpleRoundTo uses asymmetric arithmetic 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 always rounds to the larger value.
AM>Попробуйте
AM>SetRoundMode(rmDown);
Спасибо, заработало
Хотя странно, SimpleRoundTo вроде не должен использовать RoundMode
| От: | mlecter |
Дата: | 15.09.04 16:04 | |
Оценка: |
Здравствуйте, mlecter, Вы писали:
M>Здравствуйте, AMogil, Вы писали:
AM>>>Пример из справки Delphi
AM>>>Expression Value
AM>>>SimpleRoundTo(1234567, 3) 1234000
AM>>>SimpleRoundTo(1.234, -2) 1.23 .
AM>>>SimpleRoundTo(1.235, -2) 1.24
AM>>>SimpleRoundTo(-1.235, -2) -1.23
AM>>>И техт:
AM>>>SimpleRoundTo uses asymmetric arithmetic 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 always rounds to the larger value.
AM>>Попробуйте
AM>>SetRoundMode(rmDown);
M>Спасибо, заработало
M>Хотя странно, SimpleRoundTo вроде не должен использовать RoundMode
M>
M>В чем причина?
Тем более, что после того как я сделаю SetRoundMode(rmDown), RoundTo начинает все округлять (естественно) вниз, в то время как SimpleRoundTo начинает округлять нормально. Получается путанница.
| От: | AMogil |
Дата: | 15.09.04 16:13 | |
Оценка: |
Здравствуйте, mlecter, Вы писали:
M>Здравствуйте, AMogil, Вы писали:
M>В чем причина?
Интересный фокус:
При вычислении SimpleRoundTo(1.345 , -2) по информации watch’a:
RoundMode rmUp rmDown
В исходном коде SimpleRoundTo
AValue / LFactor 134.5 134.5
(AValue / LFactor) + 0.5 135 135
Trunc((AValue / LFactor) + 0.5) 134 (. ) 135
В моем коде (Trunc(135)) 135 135
| От: | AMogil |
Дата: | 15.09.04 16:17 | |
Оценка: |
Здравствуйте, AMogil, Вы писали:
AM>Здравствуйте, mlecter, Вы писали:
Форматирование сбилось. Снова табличка.
| От: | Аноним |
Дата: | 15.09.04 18:47 | |
Оценка: |
Здравствуйте, AMogil, Вы писали:
AM>
Да, дело в IntPower.
rmNearest
lFactor := IntPower(10, -2) > 0.01 !
Frac((AValue / LFactor) + 0.5) = 1 .
отсюда и Trunc(. ) = 134
rmDown
lFactor := IntPower(10, -2) Re[3]: RoundTo
| От: | kavlad | http://www.wavesoft.ru |
Дата: | 16.09.04 06:05 | ||
Оценка: |
Здравствуйте, Diouzshev, Вы писали:
m>> Проблема в RoundMode
m>> Если даже стоит rmNearest округление происходит банковским методом.
m>> Можно ли округлять не банковским методом?
D>Можно!
В семерке есть функия
SimpleRoundTo function
Rounds a floating-point value to a specified digit or power of ten using asymmetric arithmetic rounding.
| От: | mlecter |
Дата: | 16.09.04 08:03 | |
Оценка: |
В итоге рабочая процедура выглядит так:
Через одно место, зато работает всегда, без всяких rmDown.
Источник