在一段程序中使用到了
time_str = str(round(time.time() * 1000))
发现在python2 和 python3 中的运行结果不一致,python3运行结果为如'1723448662082'这种的一串数字字符串,但是在python2中运行的结果是如 '1.72344865124e+12' 这种用科学计数法表示的数字字符串。
打印一下每一步运算的结果:
def test_time_format():
time_0 = time.time()
time_1 = time_0 * 1000
time_2 = round(time_1)
time_3 = str(time_2)
type_result = type(time_3)
time_str = str(round(time.time() * 1000))
print( time_0, time_1, time_2, time_3, type_result, time_str)
python2的输出结果为:
(1723448651.237, 1723448651237.0, 1723448651237.0, '1.72344865124e+12', <type 'str'>, '1.72344865124e+12')
python3的输出结果为:
1723448662.0817554 1723448662081.7554 1723448662082 1723448662082 <class 'str'> 1723448662082
所以,可以看出是在计算str()这一步出现的问题。
在 Python 2 和 Python 3 中,time.time() 函数都返回当前时间的时间戳,返回的是一个浮点数,表示从纪元(Epoch,即1970年1月1日00:00:00 UTC)开始到现在的秒数。当乘以1000并四舍五入时,理论上在 Python 2 和 Python 3 中应该得到相同的结果。但是 Python 2 和 Python 3 在处理浮点数和字符串转换方面有一些差异。
Python 3中str()函数的行为与Python 2中的unicode()函数类似,它尝试将对象转换为文本字符串表示。
在Python 2中,str()函数和Python 3中的str()基本上没有区别,它返回对象的字符串表示。但在Python 2中,还有一个unicode()函数,它返回对象的Unicode字符串表示。
如果你在Python 2环境中使用str()函数处理非字符串对象,它可能会返回字节字符串(在处理字符串时)或者Unicode字符串(在处理Unicode对象时),这取决于对象的类型。
在Python 3中,unicode()函数不存在,所有的字符串都是Unicode字符串。
为了保持 Python 2 和 Python 3 的一致性,可以使用更明确的格式化方法来确保结果相同。例如,可以使用格式化字符串来确保浮点数转换为字符串时具有相同的小数位数。
import time
# 使用格式化字符串确保结果一致
result = "{:.0f}".format(round(time.time() * 1000))
{:.0f} 表示将浮点数格式化为没有小数部分的字符串。这样,无论在 Python 2 还是 Python 3 中,都会得到相同的结果。
如果你需要更精确的控制,比如保留特定数量的小数位,你可以调整格式化字符串。例如,{:.3f} 会保留三位小数。