2017-12-12 4 views
3

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 
+0

Ehm으로 'ftExtended'로 정의 하시겠습니까? – Victoria

+0

그래,하지만 대부분 우리는'MSSQL'과'NUMERIC (..)'필드를 사용하고 있으며, 그 결과 델파이 측에'ftFmtBcd' 필드가 생깁니다. 데이터베이스의 필드를 변경하고 싶지 않습니다 ... – ventiseis

+2

시애틀 문제 인 것 같습니다. 그냥 도쿄에서 시도하고 그것이 효과가 놀랐습니다. 아마도 https://quality.embarcadero.com/browse/RSP-16200과 관련이 있습니까? – ventiseis

답변

1

엄격 TBcd 기록을 반환 TField.AsBCD을 사용하는 것이 더 정확할 것을 말하기. TFmtBcdField은 기본 구현을 재정의하고 이라는 정확한TBcd 레코드를 반환합니다.

TBcd은 단순한 산술 연산자와 암시 적 변환을 지원하는 IntegerDouble의 레코드 구조입니다. 그래서 대부분의 목적에 적합해야합니다.

단점은 다음과 같습니다

  • 수학 연산으로 인해 기계 명령어 내장의 부족으로 소폭 느려질 수 있습니다. 그러나 정확한 표현이 필요한 경우에는 아마도 합리적인 트레이드 오프 일 것입니다. 필요에 따라 벤치 마크하고 평가하십시오.
  • Double 또는 Integer 매개 변수를 사용하는 일부 기능에는 TBcd 오버로드 구현이 필요할 수 있습니다.

일부 관련 고려 사항 :

  • Double의 사용으로 인해 자연을 부동 소수점 표현으로 당신이 정확한 정밀도를 필요가 아닌 경우에 적합하다. 자세한 내용은 Is floating point math broken?을 참조하십시오.
  • 여분의 2 바이트가 더 큰 범위와 높은 정밀도를 제공하더라도 Extended의 사용에는 과 같은 문제가 있습니다. 여전히 부동 소수점 데이터 형식입니다. 또한 Extended에는 자체 문제가 있습니다. 경고 here을 기록하십시오.
  • 정확한 표현이 필요하지 않은 경우 을 사용하여 Double으로 변환 할 수 있습니다. BCD Support Routines을 참조하십시오.
  • 소수점 이하 4자를 필요로하지 않지만 정확한 표현이 필요한 경우에 고려할 수있는 또 다른 옵션은 Currency 데이터 형식을 사용하십시오. 이것은 4 비트 10 진수를 지원하는 방식 인 10000으로 가정 된 나누기로 64 비트 정수로 표현됩니다.
관련 문제