Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

Как преобразовать число с плавающей точкой в ненаучный формат   Найти похожие ветки 

 
NAlexey ©   (2004-05-06 12:49) [0]

Никак не могу разобраться как это сделать. Необходимо преобразовывать большие числа с плавающей точкой в строку. Как мне из числа:

var
 Ex: Extended;
begin
 Ex := 999999999999999999.9;

получить такую же строку?


 
clickmaker ©   (2004-05-06 12:51) [1]

FormatFloat


 
NAlexey ©   (2004-05-06 12:54) [2]

>clickmaker ©   (06.05.04 12:51) [1]
Применение этой ф-ции к такому числу вернет строку 1E18 мне нужно получить строку "999999999999999999.9".


 
NAlexey ©   (2004-05-06 14:24) [3]

Попробую еще раз напомнить о своей проблеме. Может всетаки кто нибудь может предложить решение или случалось делать похожее. Казалось бы задачка проще некуда, но никак и все тут.


 
Mim1 ©   (2004-05-06 14:27) [4]

ИМХО Число слишком большое, extended его не вмещает, уберите например три знака.


 
TUser ©   (2004-05-06 14:32) [5]

Format("%.1f",[ex]);


 
NAlexey ©   (2004-05-06 14:34) [6]

>TUser ©   (06.05.04 14:32) [5]
Применение Format вернет строку 1E18  мне надо получить "999999999999999999.9".


 
TUser ©   (2004-05-06 14:38) [7]

Нет. Format вернет, что надо.


 
NAlexey ©   (2004-05-06 14:41) [8]

Не понял, называется не верь глазам своим?:

ShowMessage(Format("%.1f",[999999999999999999.9])) - 1E18.


 
Курдль ©   (2004-05-06 14:57) [9]


> TUser ©   (06.05.04 14:38) [7]
> Нет. Format вернет, что надо.

Ты сам-то попробуй! Не следует перманентно считать вопрошающего глупее себя!


 
NAlexey ©   (2004-05-07 08:32) [10]

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


 
KilkennyCat ©   (2004-05-07 08:36) [11]

Ну... есть старые добрые громоздкие способы:

Делим его, пока до ноля не исчезнет, кусочки же преобразуем... э... щас код напишу.


 
USTAS   (2004-05-07 09:13) [12]

FloatToStrF(число,ffFixed,15,2)


 
NAlexey ©   (2004-05-07 09:28) [13]

Применение FloatToStrF вернет строку 1E18  мне надо получить "999999999999999999.9".


 
KilkennyCat ©   (2004-05-07 09:35) [14]

s := inttostr(trunc(int(ex))) + copy(floattostr(frac(ex)),2,length(floattostr(frac(ex))) - 1);

выдает 9...99,875 но, может из-за того, что у меня Делфи непрпатчена? проверьте.


 
NAlexey ©   (2004-05-07 09:45) [15]

>KilkennyCat ©   (07.05.04 09:35) [14]
Спасибо канечно, но это не выход. Если например число вылезет за пределы Int64 да даже такое не получится преобразовать:
9999999999999999999.9
Сдается мне, что необходимо работать с мантиссой и экспонентой, но как? Что то решение не приходит.


 
NAlexey ©   (2004-05-07 09:48) [16]

Или всетаки придется ограничивать вводимые числа не MaxExtended а количеством введенных знаков, 20 ввели - все, дальше нельзя иначе ай.


 
KilkennyCat ©   (2004-05-07 09:50) [17]

В модуле Math есть функции, разделяющие мантиссу и експоненту... попробвал... что-то вообще ахинею выдало. Через пару часиков скину решение для любой разрядности. (занят просто на работе)


 
Term ©   (2004-05-07 10:05) [18]

а str() не подойдёт??? правда на таких числах никогда не проверял


 
Григорьев Антон   (2004-05-07 10:09) [19]


> KilkennyCat ©   (07.05.04 09:35) [14]
> s := inttostr(trunc(int(ex))) + copy(floattostr(frac(ex)),2,length(floattostr(frac(ex)))
> - 1);
>
> выдает 9...99,875 но, может из-за того, что у меня Делфи
> непрпатчена? проверьте.


Нет, это правильное значение. Точность в 19 знаков обеспечена, а больше Extended просто не может.


 
ASMiD ©   (2004-05-07 10:09) [20]

Не просто Str, а с форматированием - Str(a:3:1,MyString)
Здесь 3 - ощее количество знаков, а 1 - количество знаков после запятой. Все знаки перед запятой добавятся сами.


 
NAlexey ©   (2004-05-07 10:09) [21]

>Term ©   (07.05.04 10:05) [18]
Str тоже не помогает. Всетаки видимо придется - NAlexey ©   (07.05.04 09:48) [16].


 
den_777   (2004-05-07 10:12) [22]

Посмотри. Конечно есть ограничения но может будет достаточно.
http://ndb.narod.ru/archive/BigNumber4_33_.rar


 
NAlexey ©   (2004-05-07 10:15) [23]

>den_777   (07.05.04 10:12) [22]
У меня ограниченный доступ в инет. Если не трудно можешь на почту кинуть я посмотрю...


 
den_777   (2004-05-07 10:19) [24]

Уже кинул


 
Term ©   (2004-05-07 10:20) [25]


> Не просто Str, а с форматированием - Str(a:3:1,MyString)
>

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


 
NAlexey ©   (2004-05-07 10:41) [26]

>den_777   (07.05.04 10:19) [24]
Спасибо, похоже что подходит. Только придется переделать чтобы умели работать с числами с плавающей точкой.


 
USTAS   (2004-05-07 14:50) [27]


function ExtToStr(num:Extended;digits:Integer):String;
var before,after: String;
begin
 if num <> 0 then
   begin
     before := IntToStr(Round(Int(num)));
     after := Copy(FloatToStrF(Frac(num),ffFixed,15,digits),Pos(DecimalSeparator,FloatToStrF(Frac(num),ffFixed,15,digits)) + 1,digits);
     Result := before + DecimalSeparator + after;
   end
 else
   Result := "0";
end;


 
NAlexey ©   (2004-05-07 15:06) [28]

>USTAS   (07.05.04 14:50) [27]
Похожий вариант предлагал KilkennyCat ©   (07.05.04 09:35) [14]. Это не решает проблемы. На числе 9999999999999999999.9 например это не сработает.


 
Anatoly Podgoretsky ©   (2004-05-07 15:17) [29]

NAlexey ©   (06.05.04 12:54) [2]
А у тебя 19 знаков.
Проверить можно на FormatFloat может она сможет сработать с 19 знаками.


 
WebErr ©   (2004-05-07 15:19) [30]

RoundTo + F1
И всё! :))))


 
NAlexey ©   (2004-05-07 15:25) [31]

>Anatoly Podgoretsky ©   (07.05.04 15:17) [29]
Почему 19? Вроде 20... Но это не принципиально, а если будет 21?
>WebErr ©   (07.05.04 15:19) [30]
Что RoundTo + F1 и все?


 
NAlexey ©   (2004-05-07 15:30) [32]

>WebErr ©   (07.05.04 15:19) [30]
Поясни свой пост, сгораю от нетерпенья. Вдруг ты нашел решение моей проблемы?


 
Anatoly Podgoretsky ©   (2004-05-07 15:37) [33]

NAlexey ©   (07.05.04 15:25) [31]
ФОрматирование ограничено 18 знаками, большинство функций, хранение 19/20 последний разряд не точный, отсюда 18


 
KilkennyCat ©   (2004-05-07 18:49) [34]


> NAlexey ©   (07.05.04 09:48) [16]
> Или всетаки придется ограничивать вводимые числа не MaxExtended
> а количеством введенных знаков, 20 ввели - все, дальше нельзя
> иначе ай.


Гм... если начинать работать с ручного ввода, то можно не ограничивать. Просто работать с числами, как со строками. Без проблем умножу, поделю, сложу и вычту... Некрасиво, конечно, да и о прочих функциях можно забыть.


 
WebErr ©   (2004-05-07 19:00) [35]


> NAlexey ©   (07.05.04 15:30) [32]

Дано:
Количество разрядов до запятой: N;
Количество разрядов после запятой: M;
Вывести строку Result во floating-point format по числу Value.
Решение:

...
uses ..., Math;
...
var
  Temp: Extended;
for i := N downto -M do
begin
  Temp := RoundTo(Value, i);
  Result := Result + IntToStr(Trunc(Pow(Temp,i))); // или -i?
  Value := Value - Temp;
end;

В общем что-то в таком духе... :))))


 
Style ©   (2004-05-07 19:06) [36]


> NAlexey ©   (07.05.04 15:30) [32]


Работай со строками - напиши свои функции деления,умножения, вычитания и сложения.


 
Style ©   (2004-05-07 19:06) [37]


> NAlexey ©   (07.05.04 15:30) [32]


Работай со строками - напиши свои функции деления,умножения, вычитания и сложения.


 
KilkennyCat ©   (2004-05-07 19:31) [38]


> WebErr ©   (07.05.04 19:00) [35]


RoundTo - это прикольно. Как и Pow.


 
KilkennyCat ©   (2004-05-07 23:25) [39]

Поскольку
 Anatoly Podgoretsky ©   (07.05.04 15:37) [33]
пояснил,
то стандартными функциями сделать что-либо невозможно, так как любая операция над числом более 999999999999999999.9 дает погрешность. Необходимо использовать сторонние библиотеки для работы с большими числами, а у них часто и вывод в строку организован (пример http://algolist.manual.ru/maths/longnum.php).
Однако, злосчастное 999999999999999999.9 успешно конвертировать можно:


var
Ex: Extended;
dr : real;
i : byte;
s : string;
begin
Ex := 999999999999999999.9;
s := inttostr(trunc(int(Ex))); //целую часть получаем
// а теперь дробную:
dr := 0;
i := 0;
repeat
  dr := dr + 0.1;
  inc(i);
until dr + int(ex) = Ex;
s := s + "," + inttostr(i);
end;


Это, конечно, притянуто за уши, но с небольшой доработкой по такому принципу можно было бы конвертировать любое число... если бы математические операции не давали погрешности.


 
NAlexey ©   (2004-05-11 08:39) [40]

>KilkennyCat ©   (07.05.04 23:25) [39]
Повторюсь опять, это не дает решение проблемы. Например число 999999999999999999.9 укладывается в такой способ, а 9999999999999999999.9 уже не укладывается. К чести Style ©   (07.05.04 19:06) [36] будет сказано что он внимательнее читает посты.

>WebErr ©   (07.05.04 19:00) [35]
Ты поражаешь глубиной своего интелекта.



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

Текущий архив: 2004.05.23;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.039 c
14-1083728152
cyborg
2004-05-05 07:35
2004.05.23
DMClient


14-1083339126
alexeyy
2004-04-30 19:32
2004.05.23
Delphi 4. Руководство разработчика баз данных


3-1083097440
Mister
2004-04-28 00:24
2004.05.23
драйвер для работы с СУБД


1-1083754763
uuuh
2004-05-05 14:59
2004.05.23
Простой вопрос.


8-1079027238
max003
2004-03-11 20:47
2004.05.23
Подскажите как можно просмотреть этот файл...