Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Round(); 
V
    Опции темы
ArtiSoft
  Дата 12.12.2009, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 10.12.2009

Репутация: нет
Всего: нет



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

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

Так нельзя, Есть варианты?
PM MAIL   Вверх
Данкинг
Дата 12.12.2009, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



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

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

 smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Guedda
Дата 12.12.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 1
Всего: 78



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

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


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
amsoft
Дата 12.12.2009, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 1
Всего: 4



можно еще так:

Код

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


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

Это сообщение отредактировал(а) amsoft - 12.12.2009, 15:56
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
Данкинг
Дата 12.12.2009, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



amsoft, да, действительно. Тогда надо позицию запятой определять. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Keeper89
Дата 12.12.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



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

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



--------------------
PM MAIL WWW   Вверх
amsoft
Дата 12.12.2009, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 1
Всего: 4



набросал функцию:

Код

uses Math

...

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


, где X - округляемое число, Y - кол-во знаков после запятой
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
profesiachuvak
Дата 13.12.2009, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 7.11.2009
Где: Беларусь, Минск

Репутация: 1
Всего: 4



Цитата

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


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

Код

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


Пример:

Код

RoundTo(1.234, -2)    1.23


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



--------------------
Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет.
PM MAIL   Вверх
Teleport
Дата 14.12.2009, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 1
Всего: 6



В своих проектах использую следующую функцию - никогда сбоев не замечал. И работает как ожидаешь. И никаких 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 - дает те же значения, что и калькулятор.

Это сообщение отредактировал(а) Teleport - 14.12.2009, 01:36


--------------------
user posted image
user posted image 
PM MAIL   Вверх
amsoft
Дата 14.12.2009, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 1
Всего: 4



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;

--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
ArtiSoft
Дата 14.12.2009, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 10.12.2009

Репутация: нет
Всего: нет



Спасибо всем))) помогло
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0566 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.