我想做一个简单的整数除法,例如1/3=0
,但uint64
表现得非常奇怪,导致我的结果被渲染为浮动。为什么呢?
python> uint64(100)/3
Out[0]: 33.333333333333336
python> uint64(100)/uint64(3)
Out[1]: 33
python> int64(100)/3
Out[2]: 33
python> int64(100)/uint64(3)
Out[3]: 33.333333333333336
python> int32(100)/int64(3)
Out[4]: 33
答案 0 :(得分:2)
这是因为Python看到了一个有符号和无符号的类型,并试图自动推导出将被签名的结果类型。但由于第一个64位数字是无符号的,因此签名版本需要65位。由于Python / Numpy中没有高于64位的整数类型,Python选择float64
。标准类型即除数3
为int64
,这就是第一个示例将转换为float64
的原因。
当然,这也适用于多重复制:
python> import numpy as np
python> type( np.int64( 10 ) * np.int64( 1 ) )
Out[0]: numpy.int64
python> type( np.uint64( 10 ) * np.uint64( 1 ) )
Out[1]: numpy.uint64
python> type( np.uint64( 10 ) * np.int64( 1 ) )
Out[2]: numpy.float64
请注意,此自动类型扣除仅适用于不同的签名类型,因为它与值无关,否则几乎所有类型都必须以float64
结尾,因为例如在连续三次乘法后,它可能不再适合uint64
。
type(uint64(12345678900)*uint64(12345678900))
/usr/bin/ipython:1: RuntimeWarning: overflow encountered in ulong_scalars
#! /usr/bin/python
Out[3]: numpy.uint64
注意:请注意,在Python 3中,简单的斜杠是默认的整数除法。相反,您必须使用3 // 2
在Python 3中将1
作为3 / 2 == 1.5
。