2010-12-02 18 views
6

मैं नंबर है कि मैं से जाने के लिए करना चाहते हैं:सबसे तेजी से रास्ता निकटतम 5/100ths के दौर में

1.215145156155 => 1.2 
1.368161685161 => 1.35 
1.578414616868 => 1.6 

(* ध्यान दें:। सैकड़ा जगह अगर यह शून्य है चिह्नित नहीं किया जाना चाहिए)

सबसे तेज़ ऐसा करने का तरीका क्या है?

यह है कि मैं क्या अभी है, और यह तेजी से पर्याप्त नहीं है:

def rounder(v): 
    v = str(round(float(v),2)) 
    if len(v) == 3: v = v + str(0) 
    d0 = int(v[0])#ones 
    d1 = int(v[2])#tenths 
    d2 = int(v[3])#hundredths 
    if d2 <= 4: 
     return str(d0)+'.'+str(d1) 
    elif 4 < d2 < 7: 
     return str(d0)+'.'+str(d1)+str(5) 
    elif d2 >= 7: 
     if d1 != 9: 
      return str(d0)+'.'+str(d1+1) 
     if d1 == 9: 
      return str(d0+1)+'.'+str(0) 

उत्तर

11

स्केल, गोल, unscale।

round(20*v)/20 

मैं आपको चेतावनी देता चाहिए कि व्यवहार आपको आश्चर्य हो सकता है:

>>> round(20*1.368161685161)/20 
1.3500000000000001 

राउंडिंग सही ढंग से काम कर रहा है, लेकिन आईईईई संख्या वास्तव में 1.35 का प्रतिनिधित्व नहीं कर सकते हैं। पायथन 2.7 इस बारे में बेहतर है और नंबर प्रिंट करते समय सबसे सरल प्रतिनिधित्व, 1.35 चुन देगा। वास्तविक संग्रहित मूल्य 2.7 और पुराने संस्करणों में समान है।

+2

यदि आप संख्या पर 'str() 'का उपयोग करते हैं, तो लंबे दशमलव को दूर जाना चाहिए। (या लंबाई को बाधित करने के लिए% f या '.format()' का उपयोग करें।) –

+2

पाइथन 2.6 में बस '1.35' दर्ज करने से' 1.3500000000000001' भी मिलता है। पायथन 2.7 और पायथन 3.x में अद्यतन एल्गोरिदम '1.35' देता है। –

+0

@ ब्रैंडन, @ स्वेन: योग्यता टिप्पणियों के लिए धन्यवाद। वे वास्तव में मेरे जवाब को पूरा करने में मदद करते हैं (क्षमा करें, मैं बस खुद की मदद नहीं कर सका)। पीएस .: "धन्यवाद" असली है। –

3

मैं

round(v * 2, 1)/2 

बहुत तेजी से होना चाहिए की कोशिश करेंगे। अन्य सुझाव संस्करण

round(v * 20)/20 

भी थोड़ा तेज हो रहा है:

$ python -mtimeit "round(1.368161685161 * 2, 1)/2" 
1000000 loops, best of 3: 0.291 usec per loop 
$ python -mtimeit "round(1.368161685161 * 20)/20" 
1000000 loops, best of 3: 0.248 usec per loop 
+0

डाउन-मतदाता के लिए: यह अभिव्यक्ति सही है। लेकिन तथ्य यह है कि इसे नीचे से वोट दिया गया था, मैं इसे नापसंद क्यों करता हूं। यह अपने स्वयं के अच्छे के लिए थोड़ा सा चालाक है। –

+1

@ मार्सेलो: मैंने अपनी पहली अभिव्यक्ति को और भी अधिक प्राकृतिक और चालाक नहीं माना, लेकिन मुझे इस तथ्य का उपयोग किया जाता है कि लोग ऐसा नहीं सोचते कि मैं क्या करता हूं। –

+1

मैं कभी-कभी इसके बारे में भी दोषी हूं। मुझे '(ए == 2)^(बी == 3)^(सी == 4)^(बिट = बुद्धि 4) के लिए खींच लिया गया है, क्योंकि बूल-वार ऑपरेटरों को" बूलियन प्रकारों पर लागू नहीं किया जाना चाहिए "। बेशक, अगर मैं '(ए == 2) लिखता हूं, तो मैं और भी अधिक फ्लाक करता हूं! = (बी == 3)! = (सी == 4)' (और सही मायने में पाइथन में, क्योंकि गलत * गलत^ट्रू ' 'झूठी! = झूठी! = सही' के समान नहीं है, लेकिन मैं इसे समय-समय पर सी ++ में करता हूं)। –

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