Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > дробную часть в целое


Автор: xapm 16.6.2013, 06:48
Hi, 

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

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

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

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

Автор: Данкинг 16.6.2013, 10:24
Перевести в string и взять второе слово от decimalseparator.

Автор: kami 16.6.2013, 15:34
Код

StrToInt(ExtractFileExt(FloatToStr(myFloat)))

Код не мой, впервые увидел что-то подобное на DM и до сих пор под впечатлением smile Единственное - тут бы задействовать потокобезопасную версию FloatToStr (принимающую TFormatSettings), чтобы точно была точка, а не запятая.

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

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

Автор: Yanis 21.6.2013, 20:30
Код

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://ru.vingrad.com//object-id51bd35796ccc198d32000002#findElement_E7045_51c48dcf6ccc196f480002fb_0

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

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

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

Автор: Yanis 21.6.2013, 21:55
Упс, там дробное другое стояло :)

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//object-id51bd35796ccc198d32000002#findElement_E7045_51c4a1846ccc19874700105d_0

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

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//object-id51bd35796ccc198d32000002#findElement_E7045_51c4a25b6ccc1963690002d1_0

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

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

теоретически там может быть бесконечное число знаков, так что постановка задачи вызывает сомнения
(ограничение точности в машинном представлении проблему вряд ли снимает) 
если 1 поделят на 3 - вы сколько конкретно троек (разрядов в вашем результате) хотите получить? 

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

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

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

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

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

)))

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)