2012-06-10 18 views
8

Delphi'yi Round gibi Excel'e almaya çalışıyorum ama yapamam. Ben 54321.245 olarak ayarlanır döviz değişkeni kullanıyorum ve ne zaman o Bankacılar Yuvarlama kullanarak yuvarlar bu değişkeni biçimlendirmekDelphi Para Birimi, her zaman Excel gibi Round'a nasıl dönüşür?

procedure TForm1.Button1Click(Sender: TObject); 
var 
s : string; 
c : currency; 
begin 
c := 54321.245; 
s := ''; 
s := s + Format('Variable: %m',[c]); 
s := s + chr(13); 
s := s + Format(' Literal: %m',[54321.245]); 
ShowMessage(s); 
end; 

Delphi Rounding

: İşte kodudur. Ancak, aynı değeri bir değişmez olarak biçimlendirdiğimde, Excel'in yuvarladığı yolu yuvarlar.

Bu, bir para birimi değişkeni mi, yoksa bir değişmez değer mi oluşturduğunu $ 54,321.25'a çevirmeyi bekliyordum. Delphi'nin her zaman Excel ile aynı şekilde yuvarlanmasını nasıl sağlayabilirim?

Sadece Delphi çemberleri farklı yolları göstermek için değişmezleri kullanıyorum

The rounding I expect to see is as follows: 
54,321.245 = 54,321.25 
54,321.2449 = 54,321.24 
54,431.2499 = 54,421.25 

Düzen. Gerçek koddaki değişkenleri kullanmayı umuyorum.

Not: Ben uzatıldıiçin para biriminden değişkeni değiştirirseniz
doğru yuvarlar

Düzenleme 2.

Bazı ben yok olduğunu ileri sürmüşlerdir

Gereksinimlerimi net bir şekilde anladım, bu kesinlikle doğru değil. İhtiyaçlarımı çok net bir şekilde anladım, açıkçası onları açıklamak için çok iyi bir iş yapıyorum. İstediğim yuvarlama yöntemi iki ondalık basamaktır. Dizin bölümünün binths değeri olduğunda> = 0.005 0,01'e yuvarlanmasını istiyorum, Delphi tarafından sunulan para birimi türü bunu yapmaz. Bu örnekte Microsoft SQL kullanarak bir para veri türü (Delphi'nin para birimi ile aynı olduğunu varsaydım) ve SQL'i tarif ettiğim şekilde parayla çevirmeyi denedim.

  • SQL Para> = 0,005 = 0,01
  • Delphi Para> = 0.005: = 0,00

Düzenleme 3.
İyi Makale: http://rvelthuis.de/articles/articles-floats.html
Olası Çözüm: http://rvelthuis.de/programs/decimals.html

Edit # 4
İşte Embarcadero tartışmadan çözümlerden biridir

function RoundCurrency(const Value: Currency): Currency; 
var 
    V64: Int64 absolute Result; 
    Decimals: Integer; 
begin 
    Result := Value; 
    Decimals := V64 mod 100; 
    Dec(V64, Decimals); 
    case Decimals of 
    -99 .. -50 : Dec(V64, 100); 
    50 .. 99 : Inc(V64, 100); 
    end; 
end;
+1

Excel tüm API'leri ve özellikleri boyunca yuvarlama% 100 tutarlı olduğundan emin misiniz? –

+0

@Warren - Hayır% 100 emin değilim. Finansal uygulamalar satıyorum ve numaraların Excel'in ortaya koyduğu ile eşleştiğinden emin olmalıyım. –

+2

Bu soruyu doğru bir şekilde cevaplamak için, gerçekten ne tür bir yuvarlama beklediğinizi bize söylemeniz gerekir. –

cevap

12

, bu aradığınız:

function RoundTo2dp(Value: Currency): Currency; 
begin 
    Result := Trunc(Value*100+IfThen(Value>0, 0.5, -0.5))/100; 
end; 
+0

Şimdiye kadar okuduğum kadarıyla, para birimiyle uğraşırken FPU kullanmanın önerilmediğini söyleyebilirim. Yuvarlama konularını takip etmek için zorlanabilir. Bağlantılı olan iş parçacığında bundan kaçınan veya büyük bir özenle uygulayan çözümler var. –

+1

+1 Güzel bitti ... Başka bir gezegenden geliyorsun David. –

+0

@SertacAkyuz Ne yapıyorsunuz? Para birimi cinsinden Aritmetik, FPU kullanımını düşünüyorum. –

0

Sen tarafından nasıl Delphi yuvarlama numaraları kontrol elde edebilirsiniz: rmNearest kullanarak Maalesef

uses Math; 
... 

procedure TForm1.Button1Click(Sender: TObject); 
var 
s : string; 
c : currency; 
begin 
SetRoundMode(rmNearest); 

c := 54321.245; 
s := ''; 
s := s + Format('Variable: %m',[c]); 
s := s + chr(13); 
s := s + Format(' Literal: %m',[54321.245]); 
ShowMessage(s); 
end; 

, Delphi numarası 54321,245 54321.24 daha yakın karar verir daha fazla 54321.25

+0

Bu tam olarak doğru değil. Eğer c: = 54321.244 değerini değiştirirseniz, 54,321.45 $ olarak biçimlendirir ve 54,321.44 dolar olmalıdır (keşke bu kadar basit olsaydı). Para yerine uzatılmış bir tür kullanılmasının bunun için uğraştığı görülüyor. –

+0

Özrüm, @CapeCodGunny. Yukarıdaki – Hendra

+0

'u düzenledim Takdir etmeyin, hepimiz öğreniyoruz. Para birimi türünün genişletilmiş yazı tipi gibi yuvarlak ya da biçimlendirilmemiş gibi görünüyor. Delphis Math birimindeki finansal fonksiyonların birkaçına baktım ve bunlardan biri para birimi kullanmıyor. Hepsi genişletilmiş tipi kullanırlar. Yani, eğer Delphi'nin Matematik birimi için çalışıyorsa, benim için çalışır. :-) –

6

RTL'yi istediğiniz gibi ilerletmek mümkün değildir.Yuvarlamada yuvarlamayı etkilemenin yolu SetRoundMode'u sets the FPU conrol word yuvarlama için kullanmaktır, ancak, söyleyebileceğim kadarıyla, aralarındaki tamı yukarı doğru yuvarlamak için hiçbir FPU desteği yoktur (ki bu genellikle önyargılı olduğundan daha yüksek değerler).

Kendi yuvarlama işlevinizi uygulamanız gerekir. Birkaç çözüm içeren Embarcadero forumlarında, Delphi Rounding thread'da kapsamlı bir tartışma var. Ben doğru anlamak

+0

Bu tam olarak aradığım şey. Teşekkür ederim. –