delphi как сохранить значение single c округление до 2 цифр после запятой в компоненте

Создал компонент

   TTestSingle = class (TComponent)
    private
     FValue: Single;
    published
     property Value: Single read FValue write FValue;
   end;

Повесил на форму задал значение 1,222 при сохранение получаю лишние цифры после запятой как убрать это. Getter Setter писать для каждого поля?

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Kromster

Все беды от того, что по стандарту записи чисел с точкой (IEEE-754), которому обычно все следуют, 1,2222 не представимо в числе с плавающей точкой (типа Single/Double/Real/Extended в Делфи).

Например, для типа Single, можно точно получить только

1.222199916839599609375    // предыдущее
1.22220003604888916015625
1.2222001552581787109375   // следующее

Доп.инфо - https://ru.stackoverflow.com/a/1477809/177188


Учтите, что даже если вы напишете свой геттер, и будете в нем округлять до 4 знаков после точки, число все равно не будет равно 1,2222(0), а будет ближайшее к нему, а IDE это от вас просто скроет.

Соответственно, что вы можете сделать:

  • не обращать внимания и работать с числами с точкой как того требует ваша программа, сравнивая и округляя их по месту
  • использовать другой тип для хранения данных (например строки или Integer * 10000)
  • как верно подсказали в комментариях, можно попробовать тип Currency (он дает 4 фиксированных знака после точки)

P.S. Более точный ответ дать затруднительно, т.к. надо разбираться, "что вам на самом деле нужно, а не чего вам кажется, что вы хотите".

→ Ссылка