2015-01-23 7 views
11

के बीच गोलाई अजगर 2 में, हम है:अजीब व्यवहार अजगर 2 और 3

>>> datetime.datetime.utcfromtimestamp(1000000000005.0/1000.0) 
datetime.datetime(2001, 9, 9, 1, 46, 40, 5000) 

लेकिन अजगर 3 में, हमने:

>>> datetime.datetime.utcfromtimestamp(1000000000005.0/1000.0) 
datetime.datetime(2001, 9, 9, 1, 46, 40, 4999) 

यह अजीब राउंडिंग का कारण क्या है व्यवहार और क्या इसका इरादा है? 1000000000005.0 अभी भी कुछ अंकों के साथ युगल की सीमा के भीतर नहीं है?

+0

दिलचस्प खोज। क्या आप अपना ओएस, पायथन sys.version पोस्ट कर सकते हैं? – dmg

+0

@ डीएमजी मैंने इसका परीक्षण पाइथन 3.4.1, 3.4.2, लिनक्स और विंडोज 7 पर किया है। – simonzack

+0

यह निश्चित रूप से करना है कि पाइथन 3 में राउंडिंग कैसे किया जाता है, यदि आप 5 से नीचे के किसी भी मान का उपयोग करते हैं और मूल्यों के लिए> 5 –

उत्तर

1

नीचे मैंने अनिवार्य रूप से utcfromtimestamp (मैंने इसे थोड़ा सा स्टैंडअलोन में संशोधित किया है) शामिल किया है।

अजगर 2 में:

import time, datetime 
def utcfromtimestamp(t): 
    y, m, d, hh, mm, ss, weekday, jday, dst = time.gmtime(t) 
    us = int((t % 1.0) * 1000000) 
    ss = min(ss, 59) 
    return datetime.datetime(y, m, d, hh, mm, ss, us) 

अजगर 3 में:

import time, datetime 
def utcfromtimestamp(t): 
    t, frac = divmod(t, 1.0) 
    us = int(frac * 1e6) 
    if us == 1000000: 
     t += 1 
     us = 0 
    y, m, d, hh, mm, ss, weekday, jday, dst = time.gmtime(t) 
    ss = min(ss, 59) 
    return datetime.datetime(y, m, d, hh, mm, ss, us) 

(इनपुट 1000000000005.0/1000.01000000000.005 लिए गणना की जाती है।)

मेरी स्टैंडअलोन संस्करण में:

अजगर 2 मॉड्यूलस ऑपरेटर % का उपयोग करता है निर्धारित करें कि इनपुट एक पूर्ण संख्या या एक अंश है या नहीं। कथन (t % 1.0) * 1000000 तब 1000000 द्वारा अंश (हमारे मामले 0.004999995231628418 में) को गुणा करता है। यह 4999.995231628418 देता है, जो 4999 पर int तक गोल किया गया है।

अजगर 3 divmod का उपयोग करता है पूरी संख्या (t) 1000000000.0 और अंश (frac) 0.005 वापस जाने के लिए। इसे वापस करने के बजाय, यह t1000000000 और frac0.004999995231628418 के रूप में देता है। यह frac * 1e6 का उपयोग कर us की गणना करने के लिए चला जाता है। यह 1000000 से 4999.995231628418 गुणा कर रहा है, जिसके परिणामस्वरूप 4999int तक गोल किया गया है।

उपयोग की जाने वाली विधियों में कोई वास्तविक अंतर नहीं है। दोनों सटीक हैं और एक ही परिणाम लौटते हैं। मेरा निष्कर्ष यह है कि पायथन 2 माइक्रोसॉन्ड को गोलाकार कर रहा है, जबकि पायथन 3 उन्हें गोल कर रहा है।

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