![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Double - колво знаков до запятой и после [D7, WinXP]
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) остановлюсь.