Как преобразовать число с плавающей запятой в строку с макс. 2 десятичных цифры в Delphi

Как преобразовать число с плавающей запятой в строку с максимальным значением FloatToStrF ( Query . FieldByName ( «Количество» ). AsFloat , ffGeneral , 18 , 2 , FS ); ffFixed цифры в Delphi7 ?

Я пробовал использовать:

ffGeneral

Но с вышесказанным, иногда больше, чем ffОбщие десятичные цифры, возвращаются, т.е. результат: 15,60000009

delphi,floating-point,delphi-7,

2

Ответов: 3


4

Используйте Decimalвместо ffGeneral.

18игнорирует Decimalпараметр.

Когда вы используете 2, ffFixedвы говорите, что хотите 18 значащих десятичных цифр. Затем подпрограмма выражает это число кратчайшим образом, используя научную нотацию, если это необходимо. Это 2игнорируется.

Когда вы используете 2, вы говорите, что вам нужны 2цифры после десятичной точки.

Если вам интересно, почему вы иногда получаете значения, которые кажутся неточными, на этом сайте можно найти много других, и другие объяснят, как работают числа с плавающей запятой.

В этом случае AsFloatвозвращается a double, который, как (большинство) других форматов с плавающей запятой, сохраняет свое значение в двоичном формате. Точно так же, как 1/3 не может быть записано в десятичной форме с конечными цифрами, ни 15.6 не могут быть представлены в двоичном виде в конечном числе бит. Система выбирает максимально возможное значение, которое может быть сохранено в a double. Точное значение в десятичной форме:

15,5999999999999996447286321199499070644378662109375

Если бы вы запросили 16 цифр точности, значение было бы округлено до 15.6. Но вы просили 18 цифр, так что вы получите 15.5999999999999996.


0

Если вы действительно имеете в виду то, что вы пишете (MAX 2 десятичные цифры) и не означает ВСЕГДА 2 десятичных разряда, то два фрагмента кода в комментариях не дадут вам желать, чтобы вы попросили (они вернут строку, которая ВСЕГДА имеет два десятичных знака цифры, т.е. ONE возвращается как «1,00» (или «1,00» для формата в зависимости от вашей десятичной точки).

Если вы действительно хотите вариант с десятичными цифрами MAX 2, вам придется немного обработать возвращаемую строку.

FUNCTION FloatToStrMaxDecimals(F : Extended ; MaxDecimals : BYTE) : STRING;
  BEGIN
    Result:=Format('%.'+IntToStr(MaxDecimals)+'f',[F]);
    WHILE Result[LENGTH(Result)]='0' DO DELETE(Result,LENGTH(Result),1);
    IF Result[LENGTH(Result)] IN ['.',','] THEN DELETE(Result,LENGTH(Result),1)
  END;

Альтернативная (и, вероятно, более быстрая) реализация может быть:

FUNCTION FloatToStrMaxDecimals(F : Extended ; MaxDecimals : BYTE) : STRING;
  BEGIN
    Result:=Format('%.'+IntToStr(MaxDecimals)+'f',[F]);
    WHILE Result[LENGTH(Result)]='0' DO SetLength(Result,PRED(LENGTH(Result)));
    IF Result[LENGTH(Result)] IN ['.',','] THEN SetLength(Result,PRED(LENGTH(Result)))
  END;

Эта функция вернет число с плавающей запятой с MAX числом указанных десятичных цифр, т.е. одна половина с цифрами MAX 2 вернет «0,5», а одна треть с десятичными цифрами MAX 2 вернет «0,33», а две трети с десятичными цифрами MAX 2 вернут «0,67». ДЕСЯТЬ с десятичными цифрами MAX 2 вернет «10».

Заключительный оператор IF должен действительно проверить правильную десятичную точку, но я не думаю, что любое значение, отличное от периода или запятой, возможно, и если один из них оставлен в качестве последнего символа в строке после того, как лишил все нули из end, то она ДОЛЖНА быть десятичной точкой.

Также обратите внимание, что этот код предполагает, что строки индексируются с 1 для первого символа, как это всегда бывает в Delphi 7. Если вам нужен этот код для мобильных компиляторов в более новых версиях Delphi, вам нужно будет обновить код. Я оставлю это упражнение до читателя :-).


0

Я использую эту функцию в своем приложении:

function sclCurrencyND(Const F: Currency; GlobalDegit: word = 2): Currency;
var R: Real; Fact: Currency;
begin
  Fact:= power(10, GlobalDegit);
  Result:= int(F*Fact)/Fact;
end;
Дельфы, с плавающей точкой, Дельфы-7,
Похожие вопросы