Форум: "Основная";
Текущий архив: 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