Форум: "Основная";
Текущий архив: 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]
Ты поражаешь глубиной своего интелекта.
← →
KilkennyCat © (2004-05-11 11:31) [41]
> [40] NAlexey © (11.05.04 08:39)
я тоже внимательно читаю посты:
я же написал, что любая операция над числом более 999999999999999999.9 дает погрешность. Данный пример привел как пример.
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.036 c