Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];

Вниз

Как грамотно округлить вещественное число до, например, тысячной?   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.013 c
15-1139838359
Arkady
2006-02-13 16:45
2006.03.05
Borland отказывается от развития Dephi и C++


2-1139976703
Триггер
2006-02-15 07:11
2006.03.05
Вопрос по SQL


1-1138870523
sally
2006-02-02 11:55
2006.03.05
Перемещение каталогов


15-1139469297
syte_ser78
2006-02-09 10:14
2006.03.05
биос для мп3 плейера


2-1140177446
zx__
2006-02-17 14:57
2006.03.05
работа с модемом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский