![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Округление
V l a d i m i r © (2004-10-21 13:42:00)Добрый день! С помощью какой функции можно округлить число с точностью до сотых?
Shama_n (2004-10-25 15:33:00) [1]Я обычно так округляю:
function BFRoundToX(RoundValue:currency;X:Currency):Currency;
var
QuantityX: integer;
RoundToNull: currency;
begin
QuantityX := Trunc(RoundValue/X);
RoundToNull := X * QuantityX;
if RoundValue < (RoundToNull + X/2)
then Result := RoundToNull
else Result := RoundToNull + X;
end;
X- до кратного какому числу округлять
1- до целых, 0,01- до сотых, 10- до кратного 10 и.т.д.
Symb (2004-10-25 14:42:00) [2]Если для того, чтобы отобразить как строку, то (с некоторой степенью точности) -- FloatToStrF.
BillyJeans (2004-10-25 11:58:00) [3]SimpleRoundTo()
Shama_n (2004-10-25 11:55:00) [4]
round - не округление как Вы его обычно представляете
К примеру round(3.5) = 4, а round(2.5) = 2 (!!!)
Ну и как Вам такое? ;)
Условие "ближайшее к х" не работает, если верхнее и нижнее значения оказываются равноудаленными (например, если дробная часть точно равна 0,5). В этих случаях Delphi перекладывает решение на операционную систему. Обычно процессоры Intel решают эту задачу в соответствии с рекомендацией IEEE округлять в сторону ближайшего четного целого числа
Anatoly Podgoretsky (2004-10-21 22:47:00) [5]Окруугляет правильно, но вот записать не может,
смотри GuAV © (21.10.04 15:35) [8] и прочее.
И потренируйся на 0.01 для Single, Double, Extended
Koala (2004-10-21 19:50:00) [6]{**********************************************************
* Created by: Пчелка@
* Date Created: 04/10/2004
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1096192293&n=0
* Input: x - число кот. округляем, k - сколько знаков после запятой
* Description: Функция округления
**********************************************************}
function RealRound(x:real{что округляем};
k:byte{ск-ко знаков после запятой будет}):real;
var p:real;
begin
p:=x*power(10,k);
if ((p-trunc(p))>=0.5) then
RealRound:=(trunc(p)+1)/power(10,k)
else RealRound:=trunc(p)/power(10,k)
end;
Округляет правильно....
GuAV (2004-10-21 19:47:00) [7]XProger © (21.10.04 19:11) [9]
Ну и как Вам такое? ;)
Меня вполне устраивает
А кого не устраивает - Round+F1+See also
Кстати там увидел SimpleRoundTo - как раз реализует [0]
XProger (2004-10-21 19:11:00) [8]round - не округление как Вы его обычно представляете
К примеру round(3.5) = 4, а round(2.5) = 2 (!!!)
Ну и как Вам такое? ;)
GuAV (2004-10-21 15:35:00) [9]
> и таких чисел множество.
Если я правильно понимаю, то из чисел содержащих не более двух знаков после запятой представить точно как двоичное число с плавающей запятой можно только те, которые содержат после запятой 00 25 50 или 75.
Anatoly Podgoretsky (2004-10-21 15:14:00) [10]TUser © (21.10.04 14:20) [5]
А это уже не округление, а изображение, отформатированое.
GuAV © (21.10.04 14:36) [6]
И две сотых тоже, а также все производные от них умноженные- деленые на степень два, и таких чисел множество.
GuAV (2004-10-21 14:36:00) [11]
> Почему, если просто на лабеле отобразить - то реально.
На лабеле обычно либо число с фиксированой запятой, либо с плавающей запятой в десятичном формате, а не двоичное число с плавающей запятой.
одну сотую невозможно представить двоичное число с плавающей запятой с конечным числом значащих знаков.
TUser (2004-10-21 14:20:00) [12]
> то не реально никакими методами
Почему, если просто на лабеле отобразить - то реально.
Anatoly Podgoretsky (2004-10-21 14:08:00) [13]Если речь о числах с плавающей запятой, то не реально никакими методами, такое возможно только для чисел с фиксированой запятой, а с плавающей большинство чисел просто не возможно представить точно.
TUser (2004-10-21 13:49:00) [14]div - эт я того, погорячился
WondeRu (2004-10-21 13:43:00) [15]a := Round(f * 100) / 100
TUser (2004-10-21 13:43:00) [16]round, *, /, div
Format - если для показывания пользователю.