Форум: "Начинающим";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];
ВнизDouble - колво знаков до запятой и после Найти похожие ветки
← →
kot666 (2006-07-23 15:53) [0]Всем привет.
Есть значение которое хранится в Double, нужно узнать сколько знаков до запятой и после.
Всем спасибо.
← →
KilkennyCat © (2006-07-23 15:55) [1]Есть свои собственные идеи?
← →
kot666 (2006-07-23 16:03) [2]пока нет:(
← →
KilkennyCat © (2006-07-23 16:10) [3]Жаль...
есть как минимум два способа.
например, изобразить число как текст.
FloatToStr
тогда кол-во до запятой и после запятой узнаем при помощи pos
← →
kot666 (2006-07-23 16:13) [4]Хм... не очень красывый, но все же...
А как-то более научнее чтоли есть? :)
← →
KilkennyCat © (2006-07-23 16:17) [5]На мой взгляд, вполне красивый... дополню, только, что запятая иногда равна точке...
нестроковый:
Делим на 10 пока не исчезнет дробная часть.
Умножаем на 10 пока не исчезнет целая часть.
Кол-во делений умножений есть искомое.
← →
kot666 (2006-07-23 16:18) [6]
> На мой взгляд, вполне красивый... дополню, только, что запятая
> иногда равна точке...
ну да...
> Делим на 10 пока не исчезнет дробная часть.
> Умножаем на 10 пока не исчезнет целая часть.
что значит не исчезнет?
← →
kot666 (2006-07-23 16:21) [7]Arithmetic routines из Math больше мне нравится...
← →
KilkennyCat © (2006-07-23 16:27) [8]ну если такие руны знакомы... да еще и нравятся... то может, хотя бы Trunc вспомнится?
← →
kot666 (2006-07-23 16:32) [9]нашел но не вышло.
Взял число 9999999999999999
trunc вернул -1566804069 нормально блин?
← →
KilkennyCat © (2006-07-23 16:36) [10]нормально.
← →
kot666 (2006-07-23 16:37) [11]и? Сколько знаков до запятой? 11? а нужно 16.
Может в JCL кто-то юзал? JclMath?
← →
KilkennyCat © (2006-07-23 16:39) [12]Вот вам 16.
showmessage(inttostr(trunc(9999999999999999.0)));
← →
Юрий Зотов © (2006-07-23 16:41) [13]Нормализованное число с плавающей точкой содержит:
- после запятой столько знаков, сколько позволяет точность типа (для Double это 15-16).
- до запятой столько знаков, чему равна экспонента числа.
Посмотрите FrExp из модуля Math (только надо учесть, что эта функция выдает результаты в двоичной, а не в десятичной системе).
← →
KilkennyCat © (2006-07-23 16:44) [14]есть еще научный способ. совсем научный.
К примеру, число из 16 девяток отобразится как 1E16...
Но, поскольку, ход мысли уже переключается на сторонние компоненты, то мне уже делать нечего, придется занятся своей программкой, а то понедельник на носу...
← →
kot666 (2006-07-23 16:47) [15]
> Посмотрите FrExp из модуля Math (только надо учесть, что
> эта функция выдает результаты в двоичной, а не в десятичной
> системе).
Юрий! Пожалуйста можно подробнее. Спасибо.
← →
Anatoly Podgoretsky © (2006-07-23 16:47) [16]kot666 (23.07.06 16:32) [9]
Такое число именно в таком виде (16 знаков) не может поместиться в double, только приблизительное, а вот куда ты помещаешь результат работы Trunc остается вопросом.
← →
kot666 (2006-07-23 16:48) [17]
> Такое число именно в таком виде (16 знаков) не может поместиться
> в double, только приблизительное, а вот куда ты помещаешь
> результат работы Trunc остается вопросом.
LongInt
← →
Юрий Зотов © (2006-07-23 16:51) [18]> kot666 (23.07.06 16:47) [15]
Дык.. она же и в справке есть, и в исходниках, да еще и с комментариями. Куда ж еще подробнее-то?
← →
kot666 (2006-07-23 16:52) [19]
> Дык.. она же и в справке есть, и в исходниках, да еще и
> с комментариями. Куда ж еще подробнее-то?
Математически :)
← →
KilkennyCat © (2006-07-23 16:53) [20]> [18] Юрий Зотов © (23.07.06 16:51)
Справка на английском.
← →
kot666 (2006-07-23 16:53) [21]
> Такое число именно в таком виде (16 знаков) не может поместиться
> в double, только приблизительное, а вот куда ты помещаешь
> результат работы Trunc остается вопросом.
Попробовал Int64 результат 16. Наверное опка на этом (trunc) остановлюсь.
← →
kot666 (2006-07-23 16:54) [22]
> Справка на английском.
у меня на русском :)
← →
Anatoly Podgoretsky © (2006-07-23 16:56) [23]kot666 (23.07.06 16:48) [17]
LongInt инт в состянии поместить только 9 знаков.
← →
Anatoly Podgoretsky © (2006-07-23 16:57) [24]kot666 (23.07.06 16:53) [21]
16 это неверный ответ, должно получиться 9999999999999999
← →
KilkennyCat © (2006-07-23 16:59) [25]> Наверное опка на этом (trunc) остановлюсь
есть еще frac
← →
kot666 (2006-07-23 17:00) [26]
> есть еще frac
спасибо. нашел.
← →
kot666 (2006-07-23 17:00) [27]
> 16 это неверный ответ, должно получиться 9999999999999999
да. но я уже о своем :)
← →
Anatoly Podgoretsky © (2006-07-23 17:04) [28]KilkennyCat © (23.07.06 16:59) [25]
Ответ 15 знаков
← →
KilkennyCat © (2006-07-23 17:06) [29]> [28] Anatoly Podgoretsky © (23.07.06 17:04)
а... кашу маслом не испортить.
← →
Юрий Зотов © (2006-07-23 17:23) [30]> 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
← →
kot666 (2006-07-23 17:26) [31]
> [30] Юрий Зотов © (23.07.06 17:23)
Премного благодарен!
← →
kot666 (2006-07-23 17:41) [32]Кстати что посоветуете для операций с данными из БД: ftFloat или ftBCD?
← →
kot666 (2006-07-23 17:42) [33]тип данных: decimal(18,4) в MS SQL
← →
Fay © (2006-07-23 17:53) [34]2 kot666 (23.07.06 17:41) [32]
В Delphi BCD плющевый
← →
kot666 (2006-07-23 17:54) [35]
> В Delphi BCD плющевый
можно на русском? :)
← →
Fay © (2006-07-23 17:56) [36]2 kot666 (23.07.06 17:54) [35]
В Делфи БЦД плюшевый
← →
kot666 (2006-07-23 17:58) [37]что значит ""плющевый"?
← →
Fay © (2006-07-23 18:07) [38]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)
Попробуй поработать с такой таблицей
← →
Anatoly Podgoretsky © (2006-07-23 18:54) [39]Юрий Зотов © (23.07.06 17:23) [30]
Но только не для его числа 9999999999999999, в этом случае в double будет совсем другое число и вывод тоже буде экспотенциальный. Точность то всего 15 знаков
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.129 c