Python上的Int与Double

Python上的Int与Double,python,int,double,Python,Int,Double,我现在在统计课上,我想知道如果你一次生成一个数字,而不是一次生成一个数字,会不会有什么不同,所以我写了一些代码 from random import randint import math total1 = 0 total2 = 0 for i in range(100000): temp = 0 for j in range(7): temp += randint(0,9)*math.pow(10,j) total1 += temp total

我现在在统计课上,我想知道如果你一次生成一个数字,而不是一次生成一个数字,会不会有什么不同,所以我写了一些代码

from random import randint
import math

total1 = 0
total2 = 0
for i in range(100000):
    temp = 0
    for j in range(7):
        temp += randint(0,9)*math.pow(10,j)
    total1 += temp
    total2 += randint(0,9999999)

print "avg1 = ", total1/100000
print "avg2 = ", total2/100000

当我运行代码时,avg1总是一个小数,avg2总是一个整数。我不明白为什么total1被认为是双精度的,因为我只向它添加了整数…

根据python文档,math.pow函数返回一个浮点数。这将隐式地将temp变量转换为浮点:


因为total1隐式转换为浮点,而total2始终用作整数,total1将返回一个十进制,total2将返回一个整数。

数学的结果。pow是一个浮点数,而不是整数,它被添加到
total1
(通过
temp
).有一个更简单的方法来回答这个问题。由于在第二种方法中,每个数字是独立于其他数字绘制的,因此所有数字的概率分布将是每个数字分布的乘积。您将统一绘制每个数字,因此它们的乘积在所有域的叉积上也是统一的。叉积是所有7位正整数的空间,因此这两种方法必须产生相同的分布。因此,只有一个实现错误才能导致它们(分布)不同。顺便说一句,重要的是要记住python中的/运算符不会隐式地将整数转换为double或float。因此,您将得到total2/100000的四舍五入答案,而total1/100000的答案更准确。您的评论在Python2中是正确的,但在Python3中不是。我在Python3.4.2和
type(1000/5)
gives
中进行了尝试。什么语法使avg2不圆?声明
total1=0.0
total2=0.0
将它们初始化为双精度。您还可以在除以时显式强制转换它们:
print“avg1=”,float(total1/100000)
。另请参见来自未来进口部的