Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.51 MB
Время: 0.043 c
2-1140201391
nirvana
2006-02-17 21:36
2006.03.05
Ошибка combobox


6-1132055270
Alkid
2005-11-15 14:47
2006.03.05
Как узнать локальный IP


2-1140241181
Хинт
2006-02-18 08:39
2006.03.05
Помогите разобраться с TSocket (WinSock)


15-1139762670
Admeral
2006-02-12 19:44
2006.03.05
Шаровары или Денейтвары?


2-1140250059
Id
2006-02-18 11:07
2006.03.05
Печать в Excel-e