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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.036 c
1-1083904561
Sirus
2004-05-07 08:36
2004.05.23
Divizion by Zero.... Нету такого понятия???? :((


1-1083938793
Cfytr
2004-05-07 18:06
2004.05.23
Папка Temp и папка, где находитсяя сам exe файл


3-1083251423
windows
2004-04-29 19:10
2004.05.23
русский язык в таблице


6-1081193765
aikidzin
2004-04-05 23:36
2004.05.23
Скачивание с WWW


3-1083134812
Негодов
2004-04-28 10:46
2004.05.23
Обработка данных перед выводом их в DBGrid





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский