Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.05.13;
Скачать: [xml.tar.bz2];

Вниз

Форматирование Double   Найти похожие ветки 

 
kull   (2002-04-26 10:54) [0]

Такой вопрос:
Делаю Format("%.2f",[11111111111111111111.0]);
На выходе получается 1,11111111111111111E19 ,
а надо: 11111111111111111100,00 ,как сделать?


 
kull   (2002-04-26 12:26) [1]

Ну чтож никто не знает.
Ну хотя бы какую-нибудь другую функцию.


 
Игорь Шевченко   (2002-04-26 12:55) [2]

День добрый,

Прежде чем "хотеть странного" можно почитать про точность представления чисел с плавающей точкой в Delphi, раздел справки Real Types...

Я бы рекомендовал использовать целые 64-битные числа для представления больших точных значений.

С уважением,


 
Johnmen   (2002-04-26 12:58) [3]

FormatFloat()


 
kull   (2002-04-26 13:03) [4]

Спасибо за совет!
Но мне не нужно представлять большие значения через 64-битные целые, и точность меня не волнует.
Меня интересует как отформатировать Double , чтоб небыло экспоненциального вида пусть это будет 1 и 300 нулей - это не важно.


 
Johnmen   (2002-04-26 13:11) [5]

пиши свою ф-ию....


 
Игорь Шевченко   (2002-04-26 13:11) [6]

День добрый, Johnmen,

Прежде чем советовать, не попробовали ?

для kull ©:

Можно попробовать использовать функцию FrExp для выделения мантиссы и экспоненты, а дальше форматировать руками, к примеру...

С уважением,


 
kull   (2002-04-26 13:12) [7]

2Johnmen
А нельзя ли конкретный пример привести к моему числу, а то я сколько не пыжился ничего не получилось.


 
kull   (2002-04-26 13:13) [8]


> Можно попробовать использовать функцию FrExp для выделения
> мантиссы и экспоненты, а дальше форматировать руками, к
> примеру...

Спасибо!
Вот это уже дело, посмотрим...


 
Johnmen   (2002-04-26 13:25) [9]

Игорь Шевченко © (26.04.02 13:11) : попробовали....


 
kull   (2002-04-26 14:35) [10]

Что то я не втыкаю, как работает FrExp.
Что такое мантисса и экспонента - объясните глупому.


 
Игорь Шевченко   (2002-04-26 14:51) [11]

День добрый,

1,11111111111111111E19

Мантисса 1.111111111111111
Экспонента E19

С уважением,


 
kull   (2002-04-26 14:57) [12]


> Игорь Шевченко © (26.04.02 14:51)

Аха... как же.
FrExp(1,M,E);
результат:
M = 0.5
E = 1

что то не похоже на 1E0 ...



 
kull   (2002-04-26 15:08) [13]

Я понял как работает FrExp: 0.5*(2^1) = 1
Правда это в моей задаче не очень поможет...


 
MBo   (2002-04-26 15:08) [14]

>kull
>что то не похоже на 1E0 ...
числа-то в двоичном виде хранятся
0.5*2^1=1


 
MBo   (2002-04-26 15:18) [15]

посчитал единички- их же 20!
это число не представить точно. 15-16 цифр для double и 17-18 для extended


 
kull   (2002-04-26 15:22) [16]

2MBo

> числа-то в двоичном виде хранятся

А какое дело в каком виде они хранятся, не вижу связи. Что неужели труднее сделать 1*(10^0)?

Оперируем-то мы ими в 10-ом виде в математических операциях.
Например 2*2 = 4, а не 100 ...


 
Игорь Шевченко   (2002-04-26 15:23) [17]

День добрый, Kull,

Извиняюсь, ошибся.
С кем не бывает :-)))

На худой конец можно текстовую строку после Format разобрать и представть в требуемом виде.
Кстати, вопрос: А зачем такие мучения нужны (в смысле, что за задача) ?

С уважением,


 
kull   (2002-04-26 15:27) [18]


> посчитал единички- их же 20!

да мне хоть 320, надо на выходе получить строку с числом дополненым нулями 300 раз, точность теряется и ладно.


 
kull   (2002-04-26 15:30) [19]


> Кстати, вопрос: А зачем такие мучения нужны (в смысле, что
> за задача) ?

Да просто нужно выводить в отчете число без буквы Е в формате с 2 знаками после запятой.


 
MBo   (2002-04-26 15:31) [20]

label1.caption:=format("%18d",[111111111111111111])+"00.00";
:)


 
Alx2   (2002-04-26 15:32) [21]

>kull © (26.04.02 15:27)
>точность теряется и ладно.

Целая часть десятичного логарифма модуля числа даст уменьшенное на единицу число, на которое надо вправо двинуть запятую, 10^<дробная часть> даст число, у которого эту запятую двигают.


 
kull   (2002-04-26 15:33) [22]


> MBo © (26.04.02 15:31)

О! да ты колдун!


 
Игорь Шевченко   (2002-04-26 15:42) [23]

День добрый, Kull,

А данные в отчете гарантировано бывают такие большие ?

Единица измерения: микрокопейки ? :-)))

С уважением,


 
kull   (2002-04-26 15:44) [24]


> Целая часть десятичного логарифма модуля числа даст уменьшенное
> на единицу число, на которое надо вправо двинуть запятую,
> 10^<дробная часть> даст число, у которого эту запятую двигают.

Ну не до такой же степени не важна точность.


 
kull   (2002-04-26 15:47) [25]


> Единица измерения: микрокопейки ? :-)))

Ну примеро так :)


 
Anatoly Podgoretsky   (2002-04-26 15:53) [26]

kull © (26.04.02 15:44)
Это не точность, а алгоритм тебе для действия


 
kull   (2002-04-26 15:57) [27]


> Это не точность, а алгоритм тебе для действия

а Log10(123.0) пробовали?
= 2.0899051114
89.9 = 123 ну очень примерно...


 
Anatoly Podgoretsky   (2002-04-26 16:06) [28]

Ну значит не понял, что тебе Alx2 © (26.04.02 15:32) написал


 
kull   (2002-04-26 16:09) [29]


> Ну значит не понял, что тебе Alx2 © (26.04.02 15:32) написал

Ну так разъясни пожалуйста.


 
kull   (2002-04-26 16:39) [30]

Нет может я что-то не так понял.
Но исходя из этой фразы -
"Целая часть десятичного логарифма модуля числа даст уменьшенное на единицу число, на которое надо вправо двинуть запятую, 10^<дробная часть> даст число, у которого эту запятую двигают."
я получаю следующее:
число 123
десятичный логарифм от 123 = 2.0899051114
целая часть от этого числа 2, а дробная 0899051114
значит сдвигая на право на 2+1 получим 89.9051114 так
или не так?




 
Alx2   (2002-04-27 07:41) [31]

>kull © (26.04.02 16:39)
:))
>десятичный логарифм от 123 = 2.0899051114
Сначала исправлюсь вместо:
"Целая часть десятичного логарифма модуля числа даст уменьшенное на единицу число, на которое надо вправо двинуть запятую"
Следует читать
"Целая часть десятичного логарифма модуля числа даст число, на которое надо вправо двинуть запятую"


Дробная часть: d=0.0899051114
10^d=1.23
Целая часть: 2
Смещаем запятую на две позиции вправо: 1.23 .. 12.3 ... 123.

Все.

Еще пример: Log10(11111111111111111111)=19.045757490560675126
Дробная часть: 0.045757490560675126
10^0.045757490560675126 = 1.11111111111111111262 Смещаем запятую на 19 позиций вправо (19 - целая часть)
Получаем: 11111111111111111126.2


 
Alx2   (2002-04-27 08:34) [32]

Короче говоря, алгоритм будет выглядеть так:

Function ScoffingValue(D: Extended): String;
Var
Lg : Extended;
IntPart, ix: Integer;
Begin
Lg := Log10(D);
IntPart := round(Int(Lg));
Result := FloatToStr(Power(10, frac(Lg)));
ix := Pos(DecimalSeparator, Result);
If ix > 0 Then Delete(Result, ix, 1);
If IntPart + 1 > Length(Result) Then
Result := Result + StringOfChar("0", 1 + IntPart - Length(Result));
If IntPart + 1 < Length(Result) Then
Insert(DecimalSeparator, Result, IntPart + 2);
End;


 
Anatoly Podgoretsky   (2002-04-27 09:22) [33]

Если учесть, что логарифм числа уже приведен в отформатированном числе y.yyyExx, то его необязательно расчитывать, можно использовать уже готовое.


 
Alx2   (2002-04-27 09:31) [34]

>Anatoly Podgoretsky © (27.04.02 09:22)
Угу
>Alx2 © (27.04.02 08:34)
Алгоритм работает для D>1


 
Andrey007   (2002-04-27 09:49) [35]

FloatToStrF(x,ffFixed,350,300);
Или Вы что-то другое имели в виду?


 
Игорь Шевченко   (2002-04-27 10:25) [36]

День добрый, Andrey007,

FloatToStrF:

The Precision parameter specifies the precision of the given value.
It should be 7 or less for values of type Single, 15 or less for values of
type Double, and 18 or less for values of type Extended.

....Так что 350 никак не получится... :-)))

С уважением,


 
Anatoly Podgoretsky   (2002-04-27 10:38) [37]

Игорь Шевченко © (27.04.02 10:25)
В любом случае пришли к предложению Johnmen © (26.04.02 13:11), что и требовалось доказать.


 
kull   (2002-04-27 10:59) [38]

Спасибо за помощь!



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.05.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.005 c
1-39692
tsarev
2002-04-26 11:52
2002.05.13
MDI окна


3-39651
Tanyusha
2002-04-16 12:37
2002.05.13
обработка соединения таблиц


1-39701
ymin
2002-04-29 16:04
2002.05.13
Showmessage(‘Давление должно быть <’ +inttostr(int2*0.8));


1-39766
AndreyS
2002-04-28 11:22
2002.05.13
Как принудительно сделать рефреш окна.


7-39874
Потерянный
2002-02-13 16:10
2002.05.13
Спящий режим





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский