Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Round();


Автор: ArtiSoft 12.12.2009, 13:02
Привет всем, ребята как можно округлить вещественное число до 1000х, например число Х=3.8471236747623, и хочу преобразовать 4 знаков после точки;
Х=3.8471. Вот я в пишу прогу таким образом:
Код

X:=3.8471236747623;
X1:=Round(X,4);

Так нельзя, Есть варианты?

Автор: Данкинг 12.12.2009, 15:42
Есть глупый вариант, но вроде работающий:
Код

x1:=strtofloat(copy(floattostr(3.8471236747623),1,6));

 smile 

Автор: Guedda 12.12.2009, 15:43
Цитата(ArtiSoft @  12.12.2009,  13:02 Найти цитируемый пост)
число до 1000х

Десятитысячных, ты хотел сказать.
Если тебе необходимо это выводить в строку, то FloatToStrF тебе поможет.

Автор: amsoft 12.12.2009, 15:56
можно еще так:

Код

X1 := Round(X*10000) / 10000;


Добавлено через 3 минуты и 20 секунд
Данкинг, 
твой вариант подойдет, если перед запятой только одна цифра  smile 

Автор: Данкинг 12.12.2009, 17:36
amsoft, да, действительно. Тогда надо позицию запятой определять. smile 

Автор: Keeper89 12.12.2009, 17:59
ArtiSoft, ИМХО для переменных это смысла не имеет, а при выводе (в строку) можно делать как сказал Guedda или так:
Код

Format('%.4f', [X]);

Автор: amsoft 12.12.2009, 19:39
набросал функцию:

Код

uses Math

...

function MyRound(X: Extended; Y: integer): Extended;
begin
Result := Round(X * Power(10,Y)) / Power(10,Y);
end;


, где X - округляемое число, Y - кол-во знаков после запятой

Автор: profesiachuvak 13.12.2009, 19:15
Цитата

Так нельзя, Есть варианты?


ArtiSoft,
если round(); нельзя, то может быть можно roundto();??
Не знаю точно что Вам надо, но предложу:
Общая форма фун-ции roundto() (модуль math):

Код

function RoundTo(const AValue: Double; const ADigit: TRoundToRange): Double;


Пример:

Код

RoundTo(1.234, -2)    1.23


з.ы. Только помните про коварное Banker’s Rounding (бухгалтерское округление  smile ), его уже обсуждали на форуме.

Автор: Teleport 14.12.2009, 01:02
В своих проектах использую следующую функцию - никогда сбоев не замечал. И работает как ожидаешь. И никаких Banker’s Rounding  smile 
Код

//хитрое округление
function RoundEx(X: Double; Precision: Integer ): Double;
{
Precision :
1 - до целых
10 - до десятых
100 - до сотых
...
}
var
  ScaledFractPart, Temp: Double;
begin
  ScaledFractPart := Frac(X) * Precision;
  Temp := Frac(ScaledFractPart);
  ScaledFractPart := Int(ScaledFractPart);
  if Temp >= 0.5 then
    ScaledFractPart := ScaledFractPart + 1;
  if Temp <= -0.5 then
    ScaledFractPart := ScaledFractPart - 1;
  RoundEx := Int(X) + ScaledFractPart / Precision;
end;


Поправлюсь:
функция, которую я привел дает значения, отличные от значений калькулятора - после 9-го знака...
Функция, которую привел amsoft - дает те же значения, что и калькулятор.

Автор: amsoft 14.12.2009, 07:42
Teleport, а так короче  smile 
Код

//хитрое округление
function RoundEx(X: Double; Precision: Integer ): Double;
var
ScaledFractPart: Double;
begin
ScaledFractPart := Frac(X) * Precision;
if ScaledFractPart > 0 
then ScaledFractPart := Trunc(ScaledFractPart + 0.5)
else ScaledFractPart := Trunc(ScaledFractPart - 0.5)
RoundEx := Int(X) + ScaledFractPart / Precision;
end;

Автор: ArtiSoft 14.12.2009, 08:47
Спасибо всем))) помогло

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)