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

Вниз

Почему StrToFloat обрезает строку?   Найти похожие ветки 

 
alsov ©   (2007-11-09 13:24) [0]

Приветствую, Мастера

Столкнулся с проблемой.
В строке число "1.2345678901234567890123456789E+49".
После перобразования получаю 1.23456789012346E49
Почему обрезает?

Делаю так
ShowMessage(FloatToStr(StrToFloat("1.2345678901234567890123456789E+49")));


 
Reindeer Moss Eater ©   (2007-11-09 13:25) [1]

Потому что есть дабл и потому что есть значащие цифры


 
alsov ©   (2007-11-09 13:28) [2]

Почему дабл
написано что
function StrToFloat(const S: string): Extended;


 
alsov ©   (2007-11-09 13:30) [3]

Такое тоже рубит
var
val: Extended;
begin
 val := StrToFloat("12345678901234567890123456789123456789012345678901234567891234567890 12345678901234567891234567890123456789012345678912345678901234567890123456789");
 ShowMessage(FloatToStr(val));
end;


 
Правильный_Вася   (2007-11-09 13:32) [4]

почитай про значащие цифры
для длинной арифметики нужны другие типы данных


 
Германн ©   (2007-11-09 13:35) [5]


> Почему StrToFloat обрезает строку?
>
> alsov ©   (09.11.07 13:24)
>
>

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374


 
alsov ©   (2007-11-09 15:58) [6]

Спасибо за статью - узнал много нового

Теперь подитожу (если конечно правильно понял)
Так как мантиса в числе равна 8 байт, то при переводе текста в число она соответсвенно округляется.

И чтобы избежать таких чисел, в интерфейсе запрещать вводить бгольшие числа в десятичном формате, а зставлять вводить в экспоненциальном.


 
alsov ©   (2007-11-09 16:07) [7]

Тогда еще встречный вопрос

Какие правила лучше наложить на edit?


 
Германн ©   (2007-11-09 16:07) [8]


> И чтобы избежать таких чисел, в интерфейсе запрещать вводить
> бгольшие числа в десятичном формате, а зставлять вводить
> в экспоненциальном.
>

Дело не столько в "формате", сколько в "точности" ака количестве значащих цифр.


 
Германн ©   (2007-11-09 16:10) [9]


> Какие правила лучше наложить на edit?

Самое простое - установить MaxLength в разумную величину.


 
alsov ©   (2007-11-09 16:21) [10]


> Самое простое - установить MaxLength в разумную величину.


Вобщем решил так

Проверять число по маске
-999999999999999E999
где 9 - любое число от 0 до 9,
в мантисе не больше 15 чисел (разделитель ожет присутстовать)
в експоненте 3 числа


 
Leonid Troyanovsky ©   (2007-11-09 16:38) [11]


> alsov ©   (09.11.07 16:21) [10]

> в експоненте 3 числа

У оной и знак бывает.

--
Regards, LVT.


 
alsov ©   (2007-11-09 17:59) [12]


> Leonid Troyanovsky ©  


Само собой

вот такая функция получилась


function IsFloat(AValue: string): Boolean;
const
 MAX_MANTISA = 999999999999999;
 MAX_EXP = 999;
var
 p: Integer;
 i: Int64;
 s: string;
begin
 result := False;
 AValue := Trim(AValue);

 if AValue="" then Exit;
 AValue := UpperCase(AValue);

 //Есть ли експонента
 p := Pos("E", AValue);
 //число в экспоненциальном виде
 if p>0 then
 begin
   //проверить експоненту
   s := Trim(Copy(AValue, p+1, 5));
   if s>"" then
   begin
     if not TryStrToInt64(s, i) then exit;
     if Abs(i)>MAX_EXP then Exit;
   end;

   //преобразовать для проверки мантиссы
   AValue := Copy(AValue, 1, p-1);
 end;
 //первобразвать в целое
 AValue := StringReplace(AValue, DecimalSeparator, "", []);
 if not TryStrToInt64(AValue, i) then exit;
 //сравнить с максимально возможным
 if Abs(i)>MAX_MANTISA then Exit;

 result := True;
end;


 
Leonid Troyanovsky ©   (2007-11-09 19:13) [13]


> alsov ©   (09.11.07 17:59) [12]

> вот такая функция получилась

See SysUtils.TryStrToFloat

--
Regards, LVT.



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

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

Наверх




Память: 0.47 MB
Время: 0.044 c
15-1193421519
Vendict
2007-10-26 21:58
2007.12.02
Географические координаты в метры


6-1175239084
Xerx
2007-03-30 11:18
2007.12.02
Альтернатива NetSessionDel


15-1193597283
artkil
2007-10-28 21:48
2007.12.02
Вопрос по созданию пиринговой сети


2-1194362965
Новичок
2007-11-06 18:29
2007.12.02
Передача данных из Парадокса в Интербейз


15-1193729620
pathfinder
2007-10-30 10:33
2007.12.02
Шифрование исполняемых файлов.





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