AsFloat конвертировать в строку - PullRequest
0 голосов
/ 20 мая 2011

Привет, я хочу преобразовать "qrysth.Fields [i] .AsFloat" в строку, поэтому я использую следующий код: FormatFloat ('0. ###############',qrysth.Fields [i] .AsFloat)

, но я считаю, что строка результата равна 12.000000000000001, тогда как qrysth.Fields [i] .AsFloat равна 12.00.Я знаю, что FormatFloat на самом деле не использует 12.00 для преобразования, но использует бесконечное число двоичных файлов для преобразования.(например, 0,1 в десятичной системе равно 0,1, но это бесконечное число в двоичной системе 0,00011001100 ...)

Есть ли другой способ получить 12,00 в случае выше?или 12,000000000000000 хотя бы?

Ответы [ 4 ]

5 голосов
/ 20 мая 2011

Если вы действительно получаете 12.000000000000001, то ваше поле не содержит ровно 12, поэтому вывод верен. Вы попросили высокую точность, поместив в формат столько символов #. Если вы не хотите, чтобы он был таким точным, используйте менее точную строку формата.

2 голосов
/ 20 мая 2011

FormatFloat('0.00',qrysth.Fields[i].AsFloat) даст '12 .00'.

Чтобы получить '12 .000000000000000', вы должны выполнить округление самостоятельно, так как нет потери точности.

1 голос
/ 20 мая 2011

хочу конвертировать "qrysth.Fields [i] .AsFloat" в строку

Тогда почему бы не использовать AsString?

qrysth.Fields[i].AsString

Это даст вам лучшее представление, если вас не интересует точная ширина. Если да, используйте FormatFloat с точным количеством нужных вам цифр - другими словами, если вы ищете 12.00, используйте FormatFloat('##.##', qrysth.Fields[i].AsFloat) или даже лучше CurrToStr и AsCurrency, поскольку они автоматически использует две цифры после десятичной точки.

0 голосов
/ 20 мая 2011
function MyFormatFloat(V: Double): String;
const
  DesiredMinPrec = '0.000000000000000';
  AssumedMaxPrec = '0.#####';
begin
  Result := FormatFloat(DesiredMinPrec, StrToFloat(FormatFloat(AssumedMaxPrec, V)));
end;
...