2012-05-22 31 views
15

मैं दशमलव मान से अभिन्न और आंशिक भागों (दोनों भागों पूर्णांक होना चाहिए) को निकालने के लिए कोशिश कर रहा हूँ:स्प्लिट दशमलव चर

decimal decimalValue = 12.34m; 
int integral = (int) decimal.Truncate(decimalValue); 
int fraction = (int) ((decimalValue - decimal.Truncate(decimalValue)) * 100); 

(मेरा उद्देश्य के लिए, दशमलव चर अप में शामिल होंगे 2 दशमलव स्थानों) को

वहाँ किसी भी बेहतर तरीके इस लक्ष्य को हासिल करने के लिए कर रहे हैं?

+0

एक बेहतर तरीका नहीं हो सकता है सब पर एक दशमलव उपयोग करने के लिए, लेकिन एक 'int' /' long' का प्रतिनिधित्व "अपने मूल्य 100 से गुणा" का उपयोग । – Rawling

+0

असामान्य मूल्यों से सावधान रहें। दशमलव के लिए अधिकतम मान ~ 7.9e28 है। Int के लिए अधिकतम मान ~ 2e9 (काफी छोटा) है। यहां तक ​​कि केवल ~ 9e18 तक जाता है। तो यदि आप जानते हैं कि मान हमेशा> = 0 होगा, तो आप एक उलंग का उपयोग कर सकते हैं जो ~ 18e18 तक जाता है, जिससे थोड़ा अधिक छूट मिलती है। – Davio

+0

इसी तरह के प्रश्न के उत्तर के उत्तर में उन हिस्सों को आंशिक भाग के लिए उपयुक्त हो सकता है: http://stackoverflow.com/a/13038524/1178314 –

उत्तर

1

कैसे के बारे में:

int fraction = (int) ((decimalValue - integral) * 100); 
+0

यह निश्चित रूप से नकारात्मक संख्याओं के लिए काम नहीं करेगा। – SOReader

+1

"अभिन्न" क्या है? –

-1

कैसे toString फ़ंक्शन का उपयोग और उसके बाद के बारे में दशमलव बिंदु पर विभाजित है, अर्थात्:

[संपादित करें] त्वरित छोटे वर्ग/विधि परीक्षण करने के लिए:

public class Test 
{ 
    public struct FractionSplit 
    { 
     public int BeforeDecimal; 
     public int AfterDecimal; 
    } 

    public FractionSplit SplitDecimal(decimal decimalValue, 
             int decimalPrecision = 2) 
    { 
     // now do the split - the apres decimal precision defined by 
     // the format function which defaults to 2 places i.e. "0.00" 
     string splitValue = decimalValue.ToString(string.Format("0.{0}", 
      new String('0', decimalPrecision)), CultureInfo.InvariantCulture); 
     string[] splitParts = splitValue.Split('.'); 

     // now factor out derived splits as ints into struct 
     var fractionSplit = new FractionSplit 
     { 
      BeforeDecimal = int.Parse(splitParts[0]), 
      AfterDecimal = int.Parse(splitParts[1]) 
     }; 

     return fractionSplit; 
    } 
} 

उपयोग:

Test test = new Test(); 
var result = test.SplitDecimal(12.1m); 

प्रति दान की इस टिप्पणी के रूप में, यह वास्तव में यह निष्कर्ष निकाल जाएगा 12.1 रिटर्न 12 और 10 है, जिसके परिणामस्वरूप पूर्णांक के रूप में है। क्या यह सही है?? - कौन जानता है, लेकिन अब उस मामले का उपयोग बंद कर देता है। यह ToString ("0. {0}") भाग के कारण है, जो डिफ़ॉल्ट रूप से किसी भी दशमलव भाग के अंत में '0' जोड़ता है जिसमें केवल एक अंक होता है।

+0

0.1 वही परिणाम 0.10 या 0.01 के रूप में देगा? – Dan

+0

राख-अच्छा बिंदु !! नहीं, नहीं, वांछित परिणाम 10 और 1 नहीं है ?? :) यानी 12.10 12 और 10 दे देंगे, 12.01 12 और 1 देगा। क्या यह सही नहीं है ?? –

+0

हां लेकिन फिर 12.1 क्या देगा? संभवतः 1 जब वांछित परिणाम 10 हो सकता है ... मुझे यकीन नहीं है कि – Dan

2

गणितीय परिभाषा का प्रयास करें:

var fraction = (int)(100.0m * (decimalValue - Math.Floor(decimalValue))); 

हालांकि यह प्रदर्शन मायने में बेहतर नहीं है, लेकिन यह कम से कम ऋणात्मक संख्याओं के लिए काम करते हैं।

+0

इसका उपयोग करने का प्रयास करें: var FileMinorPartClient = (int) (100.0m * (clientFileVersion - Math फर्श (clientFileVersion))); मुझे मिलता है: "ऑपरेटर '*' प्रकार 'के संचालन के लिए' दशमलव 'और' डबल '" (क्लाइंटफाइलवर्सन एक डबल, ला ला 1.4) –

+1

@ बीक्लेशैनन ऐसा कहता है क्योंकि आप उन दोनों को मिश्रण नहीं कर सकते । या तो '100.0m' से' 100.0' में बदलें या सुनिश्चित करें कि 'दशमलव वैल्यू' 'दशमलव' प्रकार – SOReader

7
 decimal fraction = (decimal)2.78; 
     int iPart = (int)fraction; 
     decimal dPart = fraction % 1.0m; 
+0

दशमलव पर मॉड्यूलस ऑपरेटर का बहुत अच्छा उपयोग है। मुझे यह काम करने की उम्मीद नहीं थी, लेकिन यह खूबसूरती से करता है (और यह तेज़ है) :) –

3
decimal fraction = doubleNumber - Math.Floor(doubleNumber) 

या ऐसा ही कुछ।

1

अंश बाहर लेने के लिए this solution उपयोग कर सकते हैं:

Math.ceil(((f < 1.0) ? f : (f % Math.floor(f))) * 10000)