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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> дробную часть в целое 
:(
    Опции темы
xapm
Дата 16.6.2013, 06:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Hi, 

Вот возник достаточно простой вопрос, как дробнуй часть числа значения double или extended преобразовать в целое.

например 0.75 в 75, тоесть понятно что 100*0.75 даст нужный результат но встаёт тогда вопрос а как узнать сколько знаков после запятой что бы подобрать множитель ?

Самый простой вариант который приходит на ум это перевести в string и посчитать length-ом , но как-то это не кашерно выглядит.
Должны же быть какие-то альтернативы в конце-то концов  smile 

Или опять таки перевести в стрингу и отрезать '0.' , но это не то ... 

Это сообщение отредактировал(а) xapm - 16.6.2013, 06:49
PM MAIL   Вверх
Данкинг
Дата 16.6.2013, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


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

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



Перевести в string и взять второе слово от decimalseparator.


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


Эксперт
***


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

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



Код

StrToInt(ExtractFileExt(FloatToStr(myFloat)))

Код не мой, впервые увидел что-то подобное на DM и до сих пор под впечатлением smile Единственное - тут бы задействовать потокобезопасную версию FloatToStr (принимающую TFormatSettings), чтобы точно была точка, а не запятая.
PM MAIL WWW   Вверх
northener
Дата 16.6.2013, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(xapm @  16.6.2013,  06:48 Найти цитируемый пост)
Вот возник достаточно простой вопрос, как дробнуй часть числа значения double или extended преобразовать в целое.

Вопрос может и простой. Но пока не понятно зачем это нужно?


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Yanis
Дата 21.6.2013, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

var
  d: Double;
  i: Integer;
begin
  d := 123.75;
  d := d - Int(d);
  ShowMessage(FloatToStr(d)); // d = 0.75

  d := 321.33;
  d := Frac(d);
  ShowMessage(FloatToStr(d)); // но здесь d = 0,569999999999993

  d := RoundTo(d, -2);
  ShowMessage(FloatToStr(d)); // а вот теперь d = 0.75
end;


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL WWW ICQ   Вверх
Poseidon
Дата 21.6.2013, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Yanis, хочется задать один вопрос: И что?


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
northener
Дата 21.6.2013, 21:28 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Yanis @  21.6.2013,  20:30 Найти цитируемый пост)
  d := 321.33;
  d := Frac(d);
  ShowMessage(FloatToStr(d)); // но здесь d = 0,569999999999993

Это что же нужно такого сделать, чтобы получить d = 0,569999999999993 ?


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Yanis
Дата 21.6.2013, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Упс, там дробное другое стояло :)

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL WWW ICQ   Вверх
Yanis
Дата 21.6.2013, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А то, что люди пишут программы не зная простых вещей. Одним примером показал как округлять и вычленять дробную часть.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL WWW ICQ   Вверх
Poseidon
Дата 22.6.2013, 03:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Ему нужно не вычленить дробную часть, а получить дробную часть в виде целого числа. 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
PointerToNil
Дата 22.6.2013, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


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

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



xapm> как узнать сколько знаков после запятой что бы подобрать множитель ?

теоретически там может быть бесконечное число знаков, так что постановка задачи вызывает сомнения
(ограничение точности в машинном представлении проблему вряд ли снимает) 
если 1 поделят на 3 - вы сколько конкретно троек (разрядов в вашем результате) хотите получить? 
PM MAIL   Вверх
Poseidon
Дата 22.6.2013, 17:18 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Цитата(PointerToNil @ 22.6.2013,  11:53)
xapm> как узнать сколько знаков после запятой что бы подобрать множитель ?

теоретически там может быть бесконечное число знаков

Не может. Он же пишет, что у него double или extended. Эти типы имеют вполне конкретное число десятичных знаков. Не нужно выдумывать себе проблем. Ответ на вопрос уже дан: искать DecimalSeparator и брать все что после него. 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
northener
Дата 22.6.2013, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Poseidon @  22.6.2013,  03:23 Найти цитируемый пост)
Ему нужно не вычленить дробную часть, а получить дробную часть в виде целого числа. 

Хм. Интересно. В этих трех случаях:
1)  Х = 1.256
2)  Х = 1.0256
3)  Х = 0.256Е-10
 результат будет одинаковый или разный?

)))


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Poseidon
Дата 23.6.2013, 00:34 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Ребята, еще раз повторю, не выдумывайте себе проблем. 
northener, результат будет разный и вообще не понятно о чем вопрос. Даже программистом быть не надо, что бы увидеть это. Но суть не в этом. Да, мы все знаем, что если в double мы присвоим 1.3, то реально там сохраниться близкое, но не точно 1.3. Все это от того, что в двоичном представлении нельзя представить 1.3 как конечную дробь, приходится округлять. Но обычных пользователей это не должно волновать. Если есть задача как у ТС, то давая программе 1.3, пользователь хочет получить в ответ 3. Нужно исходить из этого и не придумывать себе геморрой. FloatToStr переведет 1.3 как надо, как ждет пользователь. Найти через pos DecimalSeparator и "забрать" все что после - труда не составит.

Добавлено через 1 минуту и 44 секунды
Ааа, northener, я понял о чем ты. smile это уже вопрос к автору и сути его задачи. Общий подход к решению это не меняет. 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
PointerToNil
Дата 23.6.2013, 01:24 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


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

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



Poseidon, у меня (как и у northener) не "выдуманная себе проблема" а лишь вопрос к тредстартеру
ты отвечаешь за него, как будто знаешь задачу точнее его самого

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

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

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

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

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


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

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


 




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


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

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