Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > урезка чисел после запятой для типа Single


Автор: Grif13 18.1.2006, 16:47
есть число типа Single,
которая равняется например "-37,455120087"
надо получить из него число "-37,45"

Делаю так

UData:=(int(UData*100))/100;

и так

UData:=(round(UData*100))/100;

получается что то вроде "-37.459999084"

в чем проблема

Автор: DemoCode 18.1.2006, 16:51
FormatFloat попробуй

Автор: sexton 18.1.2006, 16:59
Может не совсем то, но все же - RoundTo

Автор: Marriage 18.1.2006, 17:26
Код

str:=copy(FloatToStr(pNumber),1,Pos(',',FloatToStr(pNumber))+2);


pNumber - число
Str - строка


точность ограничивается 15-ю значимыми цыфрами

Автор: Alexeis 18.1.2006, 17:28
Цитата

получается что то вроде "-37.459999084"

Операции над числами с плавающей точкой (в данном случае деление) осуществляются с некоторой машинной погрешностью
Так что подобный результат неизбежен.
ps Красиво форматировать можно только строки и целые числа

Автор: Guedda 18.1.2006, 17:37
функция FloatToStrF. Можешь почитать в хелпе
Вот метод:
Код

var
  x : real;
begin
  x := 120/33;
  ShowMessage(FloatToStrF(x, ffNumber, 8,2));
end;

Автор: Grif13 19.1.2006, 08:48
ни чего не помогает

Может проблема в другом

даже если в переменную типа single заношу к примеру 2.37
то в в ней оказывается 2.3699998856


Автор: Alexeis 19.1.2006, 10:10
Цитата

даже если в переменную типа single заношу к примеру 2.37
то в в ней оказывается 2.3699998856

такое тоже возможно так как не все вещественные десятичные можно перевести точно в двоичное представление.
2.37D = 10.0(1011110000)B те с периодом.

Автор: Rennigth 19.1.2006, 10:45
не оптимально может быть, но все же:
Код

function RoundFloat(AValue: Extended; ALengthMantice: Integer): Extended;
var
  lRes: string;
  lMantice: string;
  i: Integer;
begin
  SetLength(lMantice, ALengthMantice);
  for i := 1 to ALengthMantice do
    lMantice[i] := '0';
  lMantice := '0.' + lMantice;
  lRes := FormatFloat(lMantice, AValue);
  Result := StrToFloatDef(lRes, 0);
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)