- Код: Выделить всё
function TriaFloatToStr(f:extended):string;
var s:string;
i,j,n,LenS:integer;
ch:char;
begin
s:=FloatToStr(f);
Result:=s;
LenS:=Length(s);
//Если длина числа меньше максимального числа знаков - значит нет ошибки округления
If LenS<18 Then Exit;
n:=pos(DecimalSeparator,s);
If LenS-n>8 Then begin
ch:=s[LenS-1];
//Найдем первый знак, отличный от предпоследнего
For i:=LenS-1 downto 1 do begin
If (s[i]<>ch)and(i<>n) Then begin
//Если девяток или нулей меньше 4, то считаем, что округлять не надо
If Lens-i<5 Then Exit;
If ch='9'Then begin
Case s[i] of
'0':s[i]:='1';
'1':s[i]:='2';
'2':s[i]:='3';
'3':s[i]:='4';
'4':s[i]:='5';
'5':s[i]:='6';
'6':s[i]:='7';
'7':s[i]:='8';
'8':s[i]:='9';
end;
If i>n Then begin//До десятичных - обрежем по текущую позицию
SetLength(s,i);
end
Else begin//Иначе - обрежем по целые и до точки заполним нулями
SetLength(s,n-1);
For j:=i+1 to n-1 do s[j]:='0';
end;
end
else begin//Обрежем по позицию/по целые
If i>n Then SetLength(s,i)
Else SetLength(s,n-1);
end;
Result:=s;
Exit;
end;
end;
end;
end;
По первым тестам - пока работает...
Да, функция будет работать только для вещественных double.