Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Double - колво знаков до запятой и после [D7, WinXP]


Страницы:   1 2

kot666 ©   (2006-07-23 15:53:00) 

Всем привет.
Есть значение которое хранится в Double, нужно узнать сколько знаков до запятой и после.
Всем спасибо.


Anatoly Podgoretsky   (2006-07-23 18:54:00) [1]

Юрий Зотов ©   (23.07.06 17:23) [30]
Но только не для его числа 9999999999999999, в этом случае в double будет совсем другое число и вывод тоже буде экспотенциальный. Точность то всего 15 знаков


Fay   (2006-07-23 18:07:00) [2]

2 kot666   (23.07.06 17:58) [37][Ответить]
> что значит ""плющевый"?
плю шевый :
use pubs
create table BCD (
ID int not null identity(1, 1) primary key,
VAL decimal(28, 9) not null
)

insert into BCD (VAL) values (999999999999999.99999999)

Попробуй поработать с такой таблицей


kot666   (2006-07-23 17:58:00) [3]

что значит ""плющевый"?


Fay   (2006-07-23 17:56:00) [4]

2 kot666   (23.07.06 17:54) [35]
В Делфи БЦД плюшевый


kot666   (2006-07-23 17:54:00) [5]


> В Delphi BCD плющевый

можно на русском? :)


Fay   (2006-07-23 17:53:00) [6]

2 kot666   (23.07.06 17:41) [32]
В Delphi BCD плющевый


kot666   (2006-07-23 17:42:00) [7]

тип данных: decimal(18,4) в MS SQL


kot666   (2006-07-23 17:41:00) [8]

Кстати что посоветуете для операций с данными из БД: ftFloat или ftBCD?


kot666   (2006-07-23 17:26:00) [9]


> [30] Юрий Зотов ©   (23.07.06 17:23)

Премного благодарен!


Юрий Зотов   (2006-07-23 17:23:00) [10]

> kot666   (23.07.06 16:52) [19]

Не считая знака, числа с плавающей точкой в машине хранятся в виде комбинации 2-х полей - вещественной мантиссы M и целой экспоненты E. Оба этих числа хранятся, естественно, в двоичном виде, а величина числа равна M*2^E.

Тип числа (Double, Extended...) определяет размер этих полей - то есть, сколько знаков содержит M и каково максимальное значение E. Эти значения есть в справке (см. Real types).

Нормализованное число - это число, у которого M < 1. Например, нормализованная десятичная форма числа 15 - это 0.15E2 (M=0.15, E=2), а числа 0.015 - это 0.15E-1 (M=0.15, E=-1).

Для любых чисел M содержит всегда одно и то же количество знаков (как уже говорилось, оно определяется только типом числа). Хоть число "круглое", хоть нет - неважно, длина M все равно одна и та же, просто для "круглого" числа M будет содержать незначащие нули.

Отсюда и вытекает то, что я сказал в [13]. Понятие же "сколько знаков после запятой" относится не к самому числу, а к его строковому (визуальному) представлению. Значит, получить его можно только одним способом - перевести нормализованную мантиссу в это самое строковое представление, убрать нули в конце строки, взять длину оставшейся строки и уменьшить ее на 2 (ноль и точка). Ну и учесть знак, если он есть.

А десятичное значение нормализованной экспоненты, ясное дело, дает число знаков до запятой.

Вот простенькая иллюстрация:

procedure TForm1.FormCreate(Sender: TObject);
var
 D: double;
 M: extended;
 E: integer;
begin
 D := 4/3;
 FrExp(D, M, E);
 D := Ldexp(M, E);
 Caption := Format('M = %g, E = %d, D = %g', [M, E, D])
end;

Описание использованных функций есть в справке по Math, а подробности машинной арифметики вещественных чисел можно посмотреть здесь:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374


KilkennyCat   (2006-07-23 17:06:00) [11]

> [28] Anatoly Podgoretsky ©   (23.07.06 17:04)

а... кашу маслом не испортить.


Anatoly Podgoretsky   (2006-07-23 17:04:00) [12]

KilkennyCat ©   (23.07.06 16:59) [25]
Ответ 15 знаков


kot666   (2006-07-23 17:00:00) [13]


> 16 это неверный ответ, должно получиться 9999999999999999

да. но я уже о своем :)


kot666   (2006-07-23 17:00:00) [14]


> есть еще frac

спасибо. нашел.


KilkennyCat   (2006-07-23 16:59:00) [15]

> Наверное опка на этом (trunc) остановлюсь


есть еще frac


Anatoly Podgoretsky   (2006-07-23 16:57:00) [16]

kot666   (23.07.06 16:53) [21]
16 это неверный ответ, должно получиться 9999999999999999


Anatoly Podgoretsky   (2006-07-23 16:56:00) [17]

kot666   (23.07.06 16:48) [17]
LongInt инт в состянии поместить только 9 знаков.


kot666   (2006-07-23 16:54:00) [18]


> Справка на английском.

у меня на русском :)


KilkennyCat   (2006-07-23 16:53:00) [19]

> [18] Юрий Зотов ©   (23.07.06 16:51)

Справка на английском.


kot666   (2006-07-23 16:53:00) [20]


> Такое число именно в таком виде (16 знаков) не может поместиться
> в double, только приблизительное, а вот куда ты помещаешь
> результат работы Trunc остается вопросом.

Попробовал Int64 результат 16. Наверное опка на этом (trunc) остановлюсь.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо