2012-06-10 24 views
8

मैं डेल्फी को एक्सेल की तरह गोल करने की कोशिश कर रहा हूं लेकिन मैं नहीं कर सकता।एक्सेल की तरह गोल करने के लिए डेल्फी मुद्रा प्रकार कैसे प्राप्त करें?

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

मुझे मुद्रा परिवर्तनीय कि 54,321.245 पर सेट किया जाता का उपयोग कर रहा है और जब मैं इस चर यह बैंकर्स गोलाई का उपयोग कर दौर से प्रारूप: यहाँ कोड है। हालांकि, जब मैं एक समान मूल्य को एक शाब्दिक के रूप में प्रारूपित करता हूं तो यह एक्सेल राउंड के तरीके से गुजरता है।

मैं इसे $ 54,321.25 पर जाने की उम्मीद कर रहा था चाहे वह मुद्रा परिवर्तनीय या शाब्दिक मूल्य बना रहा हो। मैं यह कैसे सुनिश्चित कर सकता हूं कि डेल्फी हर समय एक्सेल के समान ही गोल करता है?

संपादित

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 

मैं केवल शाब्दिक उपयोग कर रहा हूँ अलग अलग तरीकों से डेल्फी दौर को दिखाने के लिए। मैं वास्तविक कोड में चर का उपयोग करने की उम्मीद करता हूं।

नोट:
अगर मैं मुद्राको बढ़ाया से चर बदलने इसे सही ढंग से दौर

# संपादित 2

कुछ सुझाव दिया है कि मैं एक की जरूरत नहीं है मेरी आवश्यकताओं की स्पष्ट समझ, यह बिल्कुल सही नहीं है। मुझे अपनी आवश्यकताओं की बहुत स्पष्ट समझ है, मैं स्पष्ट रूप से उन्हें समझाने का बहुत अच्छा काम नहीं कर रहा हूं। राउंडिंग विधि जो मैं चाहता हूं वह दो दशमलव स्थान है। जब दशमलव भाग में हजारों मूल्य होते हैं> = 0.005 मैं इसे 0.01 तक गोल करना चाहता हूं, डेल्फी द्वारा प्रस्तावित मुद्रा प्रकार ऐसा नहीं करता है। मैंने माइक्रोसॉफ्ट एसक्यूएल का उपयोग करके एक पैसा डेटाटाइप (जिसे मैंने माना था डेल्फी की मुद्रा के समान था) के साथ इस उदाहरण का भी प्रयास किया था और एसक्यूएल ने जिस तरह से वर्णन किया है, उसके अनुसार एसक्यूएल राउंड।

  • एसक्यूएल मनी> = 0,005 = 0,01
  • डेल्फी मुद्रा> = 0.005: = 0,00

# संपादित 3
अच्छा अनुच्छेद: http://rvelthuis.de/articles/articles-floats.html
संभव समाधान: http://rvelthuis.de/programs/decimals.html

संपादित करें # 4
यहाँ Embarcadero चर्चा से समाधान में से एक है

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

आप यह सुनिश्चित करें कि एक्सेल अपने सभी API और सुविधाओं भर गोलाई में 100% संगत है कर रहे हैं? –

+0

@Warren - नहीं, मैं 100% निश्चित नहीं हूं। मैं वित्तीय अनुप्रयोगों को बेचता हूं और मुझे यह सुनिश्चित करने की ज़रूरत है कि मेरी संख्या मेल खाती है जो एक्सेल बाहर निकलती है। –

+2

इस प्रश्न का सही उत्तर देने के लिए, आपको वास्तव में हमें यह बताना होगा कि आप किस प्रकार की राउंडिंग की उम्मीद करते हैं। –

उत्तर

12

अगर मैं तुम्हें सही ढंग से समझ, तो आप इस के लिए देख रहे हैं:

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

जहां तक ​​मैंने अभी तक पढ़ा है, मैं मुद्रा से निपटने के दौरान एफपीयू का उपयोग करने की सलाह नहीं दे रहा हूं। यह गोल करने के मुद्दों को ट्रैक करने के लिए कड़ी मेहनत कर सकते हैं। मेरे द्वारा जुड़े धागे में समाधान हैं जो इससे बचते हैं या बहुत सावधानी से करते हैं। –

+1

+1 अच्छी तरह से किया गया ... आप एक और ग्रह डेविड से हैं। –

+0

@SertacAkyuz आप क्या चल रहे हैं? मुद्रा में अंकगणित मुझे लगता है कि एफपीयू का उपयोग करता है। –

0

आप से कैसे डेल्फी राउंडिंग संख्या पर नियंत्रण पाने के कर सकते हैं:

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; 
दुर्भाग्य

, rmNearest का उपयोग कर, डेल्फी का फैसला करता है नंबर 54321.245 54,321.24 के करीब है 54321.25

+0

यह बिल्कुल सही नहीं है। यदि आप c: = 54321.244 के मान को बदलते हैं तो यह $ 54,321.45 के रूप में स्वरूपित होता है और यह $ 54,321.44 होना चाहिए (मेरी इच्छा है कि यह इतना आसान हो)। ऐसा लगता है कि मुद्रा के बजाय एक विस्तारित प्रकार का उपयोग करना इसके लिए काम है। –

+0

मेरी माफ़ी, @CapeCodGunny। मैंने उपरोक्त – Hendra

+0

संपादित किया है माफी माँगें, हम सभी सीख रहे हैं। ऐसा प्रतीत होता है कि मुद्रा प्रकार विस्तारित प्रकार की तरह गोल या प्रारूप नहीं है। मैंने डेल्फीस मैथ यूनिट के अंदर कई वित्तीय कार्यों को देखा और उनमें से कोई भी मुद्रा प्रकार का उपयोग नहीं करता है। वे सभी विस्तारित प्रकार का उपयोग करते हैं। इसलिए, अगर यह डेल्फी की गणित इकाई के लिए काम करता है तो यह मेरे लिए काम करता है। :-) –

6

आरटीएल को जिस तरह से आप चाहते हैं उसे गोल करना संभव नहीं है।डेल्फी में गोलाकार को प्रभावित करने का तरीका SetRoundMode का उपयोग करना है, जो sets the FPU conrol word राउंडिंग के लिए है, हालांकि, जहां तक ​​मैं कह सकता हूं, ऊपर के बीच में सटीक गोल करने के लिए कोई एफपीयू समर्थन नहीं है (जिसे आम तौर पर टाला जाता है क्योंकि यह पूर्वाग्रह उत्पन्न करता है उच्च मूल्य)।

आपको अपने स्वयं के राउंडिंग फ़ंक्शन को लागू करना होगा। Embarcadero मंचों पर Delphi Rounding thread में एक विस्तृत चर्चा हुई है, जिसमें कई समाधान शामिल हैं।

+0

यह वही है जो मैं खोज रहा था। धन्यवाद। –