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

Вниз

Почему 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
2-1194597655
allucard
2007-11-09 11:40
2007.12.02
Работа с массивом через указатели


3-1184448285
Anar
2007-07-15 01:24
2007.12.02
Как прокручивать записи в DBGrid скроллером мышки?


3-1184426535
__alex
2007-07-14 19:22
2007.12.02
Про BDE4 и BDE5


2-1194519342
allucard
2007-11-08 13:55
2007.12.02
Работа с массивом


2-1194459961
OP
2007-11-07 21:26
2007.12.02
Как присвоить событие, только что созданному объекту?