![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как грамотно округлить вещественное число до, например, тысячной? [D7, WinXP]
Galiaf © (2006-02-12 11:40:00)Я конечно пробовал переводить ф-цией Floattostr в строку, а потом отрезать ненужное и обратно переводить в вещественное. Но разве этот способ можно назвать грамотным? Кто знает такую ф-цию, напишите, если таковой нет, может есть идеи?
Галинка (2006-02-14 00:04:00) [1]Galiaf © (12.02.06 13:57) [8]
Да ну? У меня если в строке не оказывается запятой, то ! ошибка выходит
В Дельфи есть функция определения десятичного знака: точка или запятая. Попробуйте, может поможет. Кажется если выбрать второе, то должно помочь.
msguns (2006-02-13 09:37:00) [2]Округления нужны в 2-х случаях:
1. Для отображения числел в "удобоваримом" стиле
2. Для вычисления хранимыхполей или чисел, участвующих в последующих вычислениях, например сумм.
Во втором случае, особенно если вычисляемое поле будет участвовать как аргумент в других вычислениях, округление особенно важно. Как пример, можно привести вычисления в материальной накладной, где надо по каждой строке округлять результат умножения цены на кол-во до сотых копейки (4 знака после дес.точки) для того, чтобы не "закосить" общую сумму по документу, получаемую суммированием всех строк, но округленную до кореек (два знака после точки).
Marser (2006-02-13 01:22:00) [3]> [8] Galiaf © (12.02.06 13:57)
> По подробнее про тип Currency можно?
Вещественный тип с фиксированной запятой(четыре дробных знака). Используется для денежных величин, откуда и название.
McSimm (2006-02-12 23:53:00) [4]> не запутывайте меня
:) помочь хотят, объяснить саму суть.
>Итак - есть ли ф-ция делающая из вещественного типа целый или функция которая может отбрасывать ненужные циферки после запятой и оставлять только нужные?
Trunc()
Чтобы отрезать после какого-то знака, умножте число на нужную степень 10
Trunc(X*1000); - получите целочисленный результат в 1000 раз больше.
Можно, если необходимо, после этого разделить его на 1000.
--
С учетом описанных вами целей похоже лучше использовать целочисленную арифметику, не превращать число обратно. Хранить целое число, равное исходному, умноженному на 1000.
XProger (2006-02-12 23:41:00) [5]FormatFloat('0.000', x)
Galiaf (2006-02-12 15:18:00) [6]не запутывайте меня!!!!!!!!!!!!!!!!!!
Anatoly Podgoretsky (2006-02-12 15:16:00) [7]vovnuke © (12.02.06 14:52) [10]
Продолжи ряд до конца.
Anatoly Podgoretsky (2006-02-12 15:15:00) [8]vrem (12.02.06 13:37) [7]
конечно стоит между 0 и 1 ^ 2+-N
vovnuke (2006-02-12 14:52:00) [9]до тысячной:умножить на 1000, отбросить дробную часть, округлить, разделить на тысячу.
isasa (2006-02-12 14:39:00) [10]vrem (12.02.06 13:37) [7]
:)
В соответствии со стандартом IEEE ее(десятичного разделителя целой и дробной частей) там вообще нет. Хранится мантисса.
Вешественные числа отображаются с нужной точностью, а преобразовывать их бессмысленно - "Те-же яйца, только вид сбоку" (С) Народная мудрость
Юзаем функцию Format.
Galiaf (2006-02-12 13:57:00) [11]По подробнее про тип Currency можно?
>А что, грамотный метод./i>
Да ну? У меня если в строке не оказывается запятой, то ! ошибка выходит, я конечно делал проверку на наличие запятой но тут такая проблема, код этот должен быть оптимизирован до каждой мельчайшей мелочи, ибо выполняется он во время движения игрока в игре, а игроки как правило двигаются всегда, я там ещё буду продумывать как сделать использование алгоритма реже (в определённых позициях) но мне надо что-то делать с этими циферками. Ещё заметил что обычный Round (если надо округлить до целого, а мне больше надо именно до целого округялть) округляет слишьком правильно (1,1 = 1; 1,6 = 2), в моём случае нужно не округлять, а отбрасывать циферки после запятой. Итак - есть ли ф-ция делающая из вещественного типа целый или функция которая может отбрасывать ненужные циферки после запятой и оставлять только нужные?
И ещё, для ф-ции RoundTo какой модуль нужно подключать?
vrem (2006-02-12 13:37:00) [12]Автор, вас обманывают! в числе с плавающей точкой точка не плавает и не будет плавать! она всегда на одном месте стоит как приклеенная.
;)
Anatoly Podgoretsky (2006-02-12 12:54:00) [13]То что точка будет плавать.
Galiaf (2006-02-12 12:34:00) [14]DrPass © (12.02.06 12:01) [3] - пасиб, буду проверять.
Anatoly Podgoretsky © (12.02.06 11:52) [1] - ты что хотел этим сказать, не то ли что как бы я не старался у меня ничего не выйдет?
palva (2006-02-12 12:32:00) [15]> Но разве этот способ можно назвать грамотным?
А что, грамотный метод. Только не нужно переводить обратно в вещественное - число исказится и вся работа насмарку. Оставить число в строковом виде. Или убрать точку и перевести в целое или Int64. Если нужны арифметические операции, то использовать тип Currency.
DrPass (2006-02-12 12:01:00) [16]x:= RoundTo(x, -3);
Если интересует вывод на экран в формате с фиксированной точкой и тремя знаками после нее, то FloatToStrF
SergP (2006-02-12 12:00:00) [17]
> Galiaf © (12.02.06 11:40)
Если до тысячной, то почему бы Currency не использовать вместо чисел с плавающей запятой?
Anatoly Podgoretsky (2006-02-12 11:52:00) [18]Ты наверно все таки про числа с плавающейзапятой? Жирным отмечено ключевое слово, которое делает все потуги бессмысленными.