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