documentation는 말한다 :ftFmtBcd로 정밀도를 잃지 않으려면 어떻게해야합니까?
TFMTBCDField 바이너리 코딩 진수 (BCD) 분야에 공통 기본 동작을 캡슐화합니다. BCD 값은 부동 소수점 수보다 더 높은 정밀도와 정확도를 제공합니다. BCD 필드는 주로 화폐 값을 저장하고 조작하는 데 사용됩니다.
불행히도, 난, 내가 (이 예에서는 두 자리) 정밀도를 잃고 Extended
값과 함께 이러한 필드를 사용한다는 찾는거야 : 나는 값 가져
BcdField.AsExtended := Value;
사용하는 경우 실제로 4 자리로 잘 렸습니다. 이것에 대해 내가 뭘 할 수 있니?
전체 예제 : (메시지 상자)
procedure TForm1.Button1Click(Sender: TObject);
var
LValue: Double;
LDataset: TClientDataSet;
LFieldDef: TFieldDef;
begin
LValue := 1/3;
LDataset := TClientDataSet.Create(self);
try
LFieldDef := LDataset.FieldDefs.AddFieldDef;
LFieldDef.DataType := ftFMTBcd;
LFieldDef.Size := 6;
LFieldDef.Precision := 10;
LFieldDef.Name := 'A';
LDataset.CreateDataset;
LDataset.Append;
LDataset.FieldByName('A').AsExtended := LValue;
LDataset.Post;
ShowMessage(FloatToStr(LDataset.FieldByName('A').AsExtended));
ShowMessage(FloatToStr(LValue));
finally
FreeAndNil(LDataset);
end;
end;
출력 :
0,3333
0,333333333333333
Ehm으로 'ftExtended'로 정의 하시겠습니까? – Victoria
그래,하지만 대부분 우리는'MSSQL'과'NUMERIC (..)'필드를 사용하고 있으며, 그 결과 델파이 측에'ftFmtBcd' 필드가 생깁니다. 데이터베이스의 필드를 변경하고 싶지 않습니다 ... – ventiseis
시애틀 문제 인 것 같습니다. 그냥 도쿄에서 시도하고 그것이 효과가 놀랐습니다. 아마도 https://quality.embarcadero.com/browse/RSP-16200과 관련이 있습니까? – ventiseis