2010-03-21 8 views
5

डबल x = 3/2 को कैसे बल दें; डी प्रत्यय या कास्टिंग के बिना एक्स में 1.5 वापस करने के लिए? क्या कोई भी ऑपरेटर अधिभार है जिसे किया जा सकता है? या कुछ संकलक विकल्प?सी # बाइनरी इंट डिवीजन को दोबारा वापस करने के लिए कैसे मजबूर करें?

आश्चर्यजनक रूप से, यह निम्न कारणों से कास्टिंग या प्रत्यय जोड़ने के लिए इतना आसान नहीं है:

व्यापार उपयोगकर्ताओं लिखने और डिबग करने के लिए अपने स्वयं के सूत्रों की जरूरत है। वर्तमान में सी # एक डीएसएल (डोमेन विशिष्ट भाषा) की तरह उपयोग किया जा रहा है जिसमें ये उपयोगकर्ता कंप्यूटर विज्ञान इंजीनियरों नहीं हैं। इसलिए वे सभी जानते हैं कि कुछ प्रकार के वर्गों को अपने "व्यवसाय नियम" रखने के लिए कैसे संपादित करना और बनाना है जो आम तौर पर केवल गणित सूत्र होते हैं।

लेकिन वे हमेशा मानते हैं कि डबल x = 3/2; x = 1.5 लौटाएगा हालांकि सी # में वापसी होगी 1.

ए वे हमेशा इसे भूल जाते हैं, बर्बाद समय डिबगिंग करते हैं, मुझे समर्थन के लिए कॉल करते हैं और हम इसे ठीक करते हैं। बी। वे सोचते हैं कि यह बहुत बदसूरत है और उनके व्यापार नियमों की पठनीयता को नुकसान पहुंचाता है।

जैसा कि आप जानते हैं, डीएसएल को प्राकृतिक भाषा की तरह अधिक होने की आवश्यकता है।

हां। हम बू को स्थानांतरित करने और इसके आधार पर एक डीएसएल बनाने की योजना बना रहे हैं, लेकिन यह सड़क से नीचे है।

क्या डबल x = 3/2 बनाने का कोई आसान समाधान है; वर्ग के बाहर बाहरी कुछ 1.5 लौटाएं ताकि यह उपयोगकर्ताओं के लिए अदृश्य हो?

धन्यवाद! वेन

+7

सी # एक डीएसएल नहीं है। सी # पुस्तकालयों और अनुप्रयोगों को बनाने के लिए उपयोग की जाने वाली एक सामान्य उद्देश्य प्रोग्रामिंग भाषा है। यदि आप गैर-प्रोग्रामर को अपने कोड बेस में सी # कोड लिखने और एकीकृत करने की अनुमति दे रहे हैं, तो आप पहले ही खो चुके हैं। यदि आपको स्क्रिप्टिंग समर्थन प्रदान करने की आवश्यकता है, तो एप्लिकेशन में एक स्क्रिप्टिंग इंजन एम्बेड करें। यदि आपके पास समय की कमी है तो इन गणित सूत्रों को बनाने के लिए एक स्केल किए गए, विशेष उद्देश्य वाक्यविन्यास या यूआई बनाएं ताकि आप उन्हें वास्तविक कोड में कैसे पसंद कर सकें। – Aaronaught

उत्तर

5

नहीं, कोई समाधान नहीं है कि 3/2 वापसी 1.5 बना सकते हैं।

आपकी बाधाओं को ध्यान में रखते हुए एकमात्र कामकाज उपयोगकर्ताओं को फॉर्मूला में अक्षर का उपयोग करने के लिए हतोत्साहित करना है। उन्हें स्थिरांक का उपयोग करने के लिए प्रोत्साहित करें। या, यदि उन्हें वास्तव में अक्षर का उपयोग करने की आवश्यकता है, तो उन्हें दशमलव बिंदु के साथ अक्षर का उपयोग करने के लिए प्रोत्साहित करें।

+1

बिना, समाधान के अलावा। –

+0

@jdk, जैसे? ... – Anzurio

+0

समाधान की तरह http://stackoverflow.com/questions/2485881/how-to-force-c-binary-int-division-to-return-a-double/2485892#2485892 .. और जैसा कि आपने भी उल्लेख किया है शाब्दिक लेकिन मैंने पहली वाक्य के बाद या आपके किए जाने से पहले टिप्पणी की थी। तो संदर्भ के बाद संदर्भ में कोई असहमत नहीं है। –

0

सरल, अगर मैं गलत नहीं हूँ:

double x = 3D/2D; 
+0

प्रश्नकर्ता कहता है: डी प्रत्यय या कास्टिंग – Anzurio

0

एक समाधान एक विधि लिख रहा होगा जो उनके लिए ऐसा करता है और उन्हें इसका उपयोग करने के लिए सिखाता है। आपकी विधि हमेशा युगल में ले जाएगी और उत्तर में हमेशा दशमलव की सही संख्या होगी।

0

मैं बहुत यकीन नहीं है, लेकिन मेरा मानना ​​है कि आप एक डबल 3.0/2.0 का उपयोग कर प्राप्त कर सकते हैं लेकिन अगर आप .0 लगता है सिर्फ प्रत्यय लगाना का एक और तरीका के रूप में तो यह जवाब

+0

यह एक अनुमान है, जवाब नहीं। अपने विशेषज्ञता के भीतर प्रश्नों का उत्तर दें। गलत उत्तर सहायक सलाह ढूंढना अधिक कठिन बनाते हैं। –

0

हो सकता है कि नहीं है भी :-) आप अब RPN Expression Parser Class को आज या bcParser पर आजमा सकते हैं? ये लाइब्रेरी पार्सिंग बहुत छोटी अभिव्यक्ति हैं।

मुझे अपने काम के लिए मजबूत, स्थैतिक रूप से टाइप की गई भाषाएं पसंद हैं, लेकिन मुझे नहीं लगता कि वे शुरुआती लोगों के लिए उपयुक्त हैं जिनके पास पेशेवर बनने में कोई रूचि नहीं है।

तो मुझे दुर्भाग्य से कहना होगा कि दुर्भाग्यवश आपकी पसंद सी # की पसंद उन दर्शकों के लिए सबसे अच्छी नहीं हो सकती है।

बू को स्थिर रूप से टाइप किया गया प्रतीत होता है। क्या आपने जावास्क्रिप्ट इंजन, पायथन, या कुछ अन्य गतिशील रूप से टाइप किए गए इंजन को एम्बेड करने के बारे में सोचा है? आमतौर पर मौजूदा एप्लिकेशन में प्लग करना कठिन नहीं होता है और आपके पास बहुत सारे मौजूदा दस्तावेज का लाभ होता है।

+0

संस्करण 3.0 से पहले पायथन को विभाजन के साथ एक ही समस्या है। – dan04

+0

ठीक है, सभी उपयोगकर्ता सी # की तरह हैं क्योंकि उनकी पहली प्राथमिकता प्रदर्शन है। और सिस्टम का महत्वपूर्ण पथ कोड पॉइंटर का उपयोग करके असुरक्षित में लिखा गया था, इसलिए वे कहते हैं, यह व्यापार उद्योग में सबसे तेज़ सॉफ्टवेयर है। इसलिए जब तक हम एक पूर्ण डीएसएल नहीं बना सकते, तब तक वे सी # के साथ रखे। – Wayne

+0

एफवाईआई, जहां तक ​​भाषा पसंद है, ऐसा लगता है कि बू उत्तर है क्योंकि यह एक्स्टेंसिबल है।यही है, आप संकलन प्रक्रिया में किसी भी चरण में पार्सर पेड़ में कुछ भी बदल सकते हैं। मेरी एकमात्र चिंता यह है कि डीबगर सुविधाएं महत्वपूर्ण हैं और ऑटो कोड पूर्णता सी # के साथ उपलब्ध हैं। मैं निश्चित नहीं हूं कि व्यापार उपयोगकर्ताओं के लिए कोड के माध्यम से कदम उठाने की क्षमता के साथ क्या होता है यदि यह एक संशोधित-बू भाषा में है। – Wayne

0

शायद int32 पर एक extenstion विधि?

+0

मैं इसे एक समाधान के रूप में प्यार करता हूं और इसे विशेष रूप से शोध करता हूं और यहां तक ​​कि कोशिश भी करता हूं। लेकिन स्पष्ट रूप से आप सी # भाषा लेखकों के अनुसार विस्तार विधियों के रूप में लोडर पर ऑपरेटर नहीं बना सकते हैं। अगर मैं ग़लत हूँ तो कृपया मुझे सही कीजियेगा। – Wayne

0

सी # कंपाइलर को पास करने से पहले प्रीप्रोसेस सूत्र। कुछ ऐसा करें:

formula = Regex.Replace(formula, @"(^|[\^\s\+\*\/-])(\d+)(?![DF\.])", "$1$2D") 

पूर्णांक अक्षरों को डबल अक्षरों में परिवर्तित करने के लिए।

वैकल्पिक रूप से, आप एक सरल राज्य मशीन का उपयोग कर सकते हैं यह ट्रैक करने के लिए कि क्या आप एक स्ट्रिंग में हैं या नहीं, अंधेरे से बदले में टिप्पणी करते हैं, लेकिन सरल सूत्रों के लिए मुझे लगता है कि एक रेगेक्स पर्याप्त होगा।

+0

बहुत चालाक। "सूत्र" वास्तव में सशर्त और उप विधियों के साथ पूर्ण तरीके हैं। यह सूत्रों के शीर्ष पर काफी जटिल तर्क है। विशेष रूप से, ये स्वचालित व्यापार नियम हैं। – Wayne

0

इस तरह यह कर का प्रयास करें:

double result = (double) 3/2; 

परिणाम = 1.5

1

कभी नहीं कभी नहीं कहते हैं ... (डबल) 3/2 समाधान अच्छा लग रहा है ...

लेकिन यह 4 + 5/6

के लिए असफल रहा: सार्वजनिक डोमेन को दान किया गया ताकि सिंबलिक कॉम्प्यूटेशन डॉट कॉम द्वारा स्वतंत्र रूप से उपयोग किया जा सके।
यह अल्फा है लेकिन आप इसे आजमा सकते हैं, मैंने इसे केवल कुछ परीक्षणों पर चलाया है, मेरी साइट और सॉफ़्टवेयर जल्द ही होना चाहिए। यह माइक्रोसॉफ्ट के रोज़लिन का उपयोग करता है, अगर यह सब ठीक हो जाता है तो यह प्रत्येक नंबर के बाद 'डी' लगाएगा। Roslyn अल्फा भी है, लेकिन यह सी # के एक उचित बिट पार्स होगा।

public static String AddDSuffixesToEquation(String inEquation) 
    { 
     SyntaxNode syntaxNode = EquationToSyntaxNode(inEquation); 
     List<SyntaxNode> branches = syntaxNode.DescendentNodesAndSelf().ToList(); 
     List<Int32> numericBranchIndexes = new List<int>(); 
     List<SyntaxNode> replacements = new List<SyntaxNode>(); 
     SyntaxNode replacement; 
     String lStr; 
     Int32 L; 
     for (L = 0; L < branches.Count; L++) 
     { 
      if (branches[L].Kind == SyntaxKind.NumericLiteralExpression) 
      { 
       numericBranchIndexes.Add(L); 
       lStr = branches[L].ToString() + "d"; 
       replacement = EquationToSyntaxNode(lStr); 
       replacements.Add(replacement); 
      } 
     } 

     replacement = EquationToSyntaxNode(inEquation); 
     List<SyntaxNode> replaceMeBranches; 
     for (L = numericBranchIndexes.Count - 1; L >= 0; L--) 
     { 
      replaceMeBranches = replacement.DescendentNodesAndSelf().ToList(); 
      replacement = replacement.ReplaceNode(replaceMeBranches[numericBranchIndexes[L]],replacements[L]); 
     } 
     return replacement.ToString(); 

    } 

    public static SyntaxNode EquationToSyntaxNode(String inEquation) 
    { 
     SyntaxTree tree = EquationToSyntaxTree(inEquation); 
     return EquationSyntaxTreeToEquationSyntaxNode(tree); 
    } 

    public static SyntaxTree EquationToSyntaxTree(String inEquation) 
    { 
     return SyntaxTree.ParseCompilationUnit("using System; class Calc { public static object Eval() { return " + inEquation + "; } }"); 
    } 

    public static SyntaxNode EquationSyntaxTreeToEquationSyntaxNode(SyntaxTree syntaxTree) 
    { 
     SyntaxNode syntaxNode = syntaxTree.Root.DescendentNodes().First(x => x.Kind == SyntaxKind.ReturnStatement); 
     return syntaxNode.ChildNodes().First(); 
    } 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^