Как бороться с приближением числа с плавающей запятой? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть TDBEdit, подключенный к TFloatField, который имеет DisplayFormat = '0.################'.Я установил значение поля на 12.123456789 и заметил, что мой элемент управления редактирования отображает его как '12,1234567890000005'.

enter image description here

НадеюсьУ меня нет глубоких знаний о числах с плавающей запятой, но я знаю, что это происходит потому, что числа с плавающей запятой аппроксимируются.

Во всяком случае, мне интересно, как я могу убедиться, что дополнительные десятичные числа никогда не будут "волшебным образом" появляться после того, как пользователь введет значение?

Я думал сократить строку DisplayFormat, удаливодин '#', но я не знаю, будет ли этого достаточно, чтобы избежать проблемы в любом состоянии.

Пример:

uses
  DBClient, DB, DBCtrls;

...

var
  Dst : TClientDataSet;
  Dsc : TDataSource;
  Fld : TFloatField;
  Edit : TDBEdit;
begin
  //components creation
  Dst := TClientDataSet.Create(Application);
  Dst.FieldDefs.Add('TEST', ftFloat, 0, False);
  Dst.CreateDataSet();

  Fld := Dst.Fields[0] as TFloatField;
  Fld.DisplayFormat := '0.################';

  Dsc := TDataSource.Create(Application);
  Dsc.DataSet := Dst;

  Edit := TDBEdit.Create(Application);
  Edit.DataSource := Dsc;
  Edit.DataField := Fld.FieldName;
  Edit.Align := alTop;
  Edit.Parent := Self;

  //test
  Dst.Open();
  Dst.Append();
  Fld.AsFloat := 12.123456789;
  Dst.Post();
...