2011-05-03 14 views
21

पावरहेल में निकटतम पूर्ण संख्या तक जाने का सबसे अच्छा तरीका क्या है?पावरहेल - निकटतम पूर्ण संख्या

मैं कोशिश कर रहा हूं [गणित] :: छेड़छाड़ लेकिन यह मुझे अनुमानित परिणाम नहीं दे रहा है।

उदाहरण:

$bla = 17.2/0.1 
[math]::truncate($bla) 

आउटपुट की उम्मीद 172 के बजाय 171!

$bla = 172 
[math]::truncate($bla) 

आउटपुट 172

बस कुछ है कि काम करता है की जरूरत है .... और हमेशा नीचे दौर चाहिए (यानी round($myNum + 0.5) बेकर के पूर्णांकन के कारण काम नहीं करेगा नंबर एक 0.5 घटक है यदि को ख़त्म कर सकता है)

सादर टेड

उत्तर

17

मठ :: मंजिल के साथ [दशमलव] घोषणा संयुक्त समारोह आप इच्छित परिणाम देना चाहिए।

[Math]::Floor([decimal](17.27975/0.1))

रिटर्न = 172

+0

बोले ... [गणित] :: मंजिल (17.2/0.1) आउटपुट 171, मैं उत्पादन 172. – ted

+0

को यह जरूरत अजीब ... यही कारण है कि है? – Louis

+1

@ लुइस: क्योंकि फ़्लोटिंग-पॉइंट नंबर '17.2' और' 0.1' का प्रतिनिधित्व नहीं कर सकते हैं, यही कारण है कि आपको अंतिम स्थानों में गोल करने वाली त्रुटियां मिल रही हैं और इस प्रकार परिणाम * * के करीब है, लेकिन 172 नहीं है। – Joey

2

[Math]::floor($x) अंतर्निहित तरीका यह करने के लिए है।

बस जागरूक रहें कि यह नकारात्मक संख्याओं के साथ कैसे व्यवहार करेगा। [Math]::floor(5.5)5 देता है, लेकिन [Math]::floor(-5.5)-6 देता है।

आप समारोह की जरूरत है मान शून्य के सबसे करीब वापस जाने के लिए, आप की आवश्यकता होगी:

If ($x -ge 0) { 
    [Math]::Floor($x) 
} Else { 
    [Math]::Ceiling($x) 
} 
+2

वापस करने के लिए शून्य के सबसे नज़दीकी मूल्य आप '[गणित] :: Truncate' का उपयोग कर सकते हैं। – Joey

7

मुद्दा आप मूल 17.2/0.1 विभाजन उदाहरण के साथ सामना कर रहे हैं (के रूप में उल्लेख दिया दशमलव मूल्यों की फ्लोटिंग प्वाइंट प्रतिनिधित्व में अशुद्धि के कारण है Joey's comment में दूसरे उत्तर पर)। निकटतम पूर्णांक तक PowerShell के रूप में परिणाम के लिए स्वचालित रूप दौर होगा

PS> $bla = 17.2/0.1 
PS> $bla.GetType().FullName 
System.Double 
PS> $bla.ToString() 
172 
PS> $bla.ToString('r') 
171.99999999999997 

इस के आसपास पाने के लिए एक आसान तरीका int के रूप में परिणाम घोषित करने के लिए है,: आप इस अंतिम मूल्य का round-trip representation का परीक्षण करके PowerShell में देख सकते हैं मूल्य:

PS> [int]$bli = 17.2/0.1 
PS> $bli.GetType().FullName 
System.Int32 
PS> $bli.ToString() 
172 

नोट यह डिफ़ॉल्ट नेट MidpointRounding.ToEven की विधि (भी बैंकर का गोलाई के रूप में जाना जाता है) का उपयोग करता है।यह अच्छा सांख्यिकीय गुण जब संख्यात्मक मान की बड़ी संख्या सारणी, लेकिन यह भी करने के लिए बदला जा सकता है है सरल से दूर शून्य विधि:

function round($value, [MidpointRounding]$mode = 'AwayFromZero') { 
    [Math]::Round($value, $mode) 
} 

PS> [int]3.5 
4 
PS> [int]4.5 
4 
PS> round 3.5 
4 
PS> round 4.5 
5 

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

PS> $bld = [decimal]17.2/0.1 
PS> $bld.GetType().FullName 
System.Decimal 
PS> $bld.ToString() 
172 
संबंधित मुद्दे