Python 3.x Python 3四舍五入问题
为什么下面的舍入在Python3中不起作用,而只在Python2中起作用Python 3.x Python 3四舍五入问题,python-3.x,rounding,Python 3.x,Rounding,为什么下面的舍入在Python3中不起作用,而只在Python2中起作用 random_nums = np.array([-1, 0, 1, 2, 3]) probabilities = np.array([0.01, 0.3, 0.58, 0.1, 0.01]) target = dict(zip(random_nums, probabilities)) target = {k: round(v, 2) for k, v in target.items()} out: {-1: 0.01,
random_nums = np.array([-1, 0, 1, 2, 3])
probabilities = np.array([0.01, 0.3, 0.58, 0.1, 0.01])
target = dict(zip(random_nums, probabilities))
target = {k: round(v, 2) for k, v in target.items()}
out:
{-1: 0.01,
0: 0.29999999999999999,
1: 0.57999999999999996,
2: 0.10000000000000001,
3: 0.01}
看起来很好用。请记住,
round
返回浮点数
它四舍五入到两位小数,但浮点数本质上是不精确的(对于几乎所有的数字),因此输出效果良好。。请记住,
round
返回浮点数
它四舍五入为两位小数,但浮点数本质上是不精确的(对于几乎所有的数字),因此输出。您使用的是NumPy
float64
对象,而不是Pythonfloat
对象。这有几个后果:
float64
对象使用NumPy的舍入代码而不是Python的舍入代码进行舍入。Python对float
s的舍入代码总是给出正确的舍入结果。NumPy的舍入代码不存在。(在Python2上,不可能覆盖自定义类型的round
操作,因此在Python2中对float64
对象进行舍入时,首先将其转换为Pythonfloat
,然后使用Python的舍入代码给出一个float
结果。这是您看到我们之间差异的主要原因en Python 2和Python 3。)float64
上的round
给出了一个float64
结果。在Python2上,float64
对象上的round
给出一个float
结果float
对象具有不同的repr
,这将提供更令人愉快的输出。特别是Python的floatrepr
保证了十进制值(不太大,也不太小)的往返,最多有15个有效数字:0.58
的表示形式是'0.58'
。NumPyfloat64
对象的表示形式没有此属性:它只是根据存储值的最有效的17位小数打印出一个结果float
对象,您将看到更令人愉快的输出(在某些情况下,结果可能更精确)。但是请注意,仅仅因为输出看起来不错,并不意味着您得到的结果是准确的。所有这些都没有改变这样一个事实,即0.58
不能准确地表示为Pythonfloat
(或者实际上是使用相同格式的NumPyfloat64
)。记住,对于二进制浮点,看到的不是得到的
Python 3上的一些示例输出:
>>> random_nums = np.array([-1, 0, 1, 2, 3])
>>> probabilities = np.array([0.01, 0.3, 0.58, 0.1, 0.01])
>>> target = dict(zip(random_nums, probabilities))
>>> {k: round(v, 2) for k, v in target.items()}
{0: 0.29999999999999999, 1: 0.57999999999999996, 2: 0.10000000000000001, 3: 0.01, -1: 0.01}
>>> {k: round(float(v), 2) for k, v in target.items()}
{0: 0.3, 1: 0.58, 2: 0.1, 3: 0.01, -1: 0.01}
您使用的是NumPy
float64
对象,而不是Pythonfloat
对象。这有几个后果:
float64
对象使用NumPy的舍入代码而不是Python的舍入代码进行舍入。Python对float
s的舍入代码总是给出正确的舍入结果。NumPy的舍入代码不存在。(在Python2上,不可能覆盖自定义类型的round
操作,因此在Python2中对float64
对象进行舍入时,首先将其转换为Pythonfloat
,然后使用Python的舍入代码给出一个float
结果。这是您看到我们之间差异的主要原因en Python 2和Python 3。)float64
上的round
给出了一个float64
结果。在Python2上,float64
对象上的round
给出一个float
结果float
对象具有不同的repr
,这将提供更令人愉快的输出。特别是Python的floatrepr
保证了十进制值(不太大,也不太小)的往返,最多有15个有效数字:0.58
的表示形式是'0.58'
。NumPyfloat64
对象的表示形式没有此属性:它只是根据存储值的最有效的17位小数打印出一个结果float
对象,您将看到更令人愉快的输出(在某些情况下,结果可能更精确)。但是请注意,仅仅因为输出看起来不错,并不意味着您得到的结果是准确的。所有这些都没有改变这样一个事实,即0.58
不能准确地表示为Pythonfloat
(或者实际上是使用相同格式的NumPyfloat64
)。记住,对于二进制浮点,看到的不是得到的
Python 3上的一些示例输出:
>>> random_nums = np.array([-1, 0, 1, 2, 3])
>>> probabilities = np.array([0.01, 0.3, 0.58, 0.1, 0.01])
>>> target = dict(zip(random_nums, probabilities))
>>> {k: round(v, 2) for k, v in target.items()}
{0: 0.29999999999999999, 1: 0.57999999999999996, 2: 0.10000000000000001, 3: 0.01, -1: 0.01}
>>> {k: round(float(v), 2) for k, v in target.items()}
{0: 0.3, 1: 0.58, 2: 0.1, 3: 0.01, -1: 0.01}
如果需要使用浮点/双精度进行精确舍入,请在转换为字符串进行输出时进行舍入。由于显示的位数,这与所选浮点精度接近。如果需要使用浮点/双精度进行精确舍入,请在转换为字符串进行输出时进行舍入。由于显示的位数,这与所选的浮点精度接近。因此,输出看起来不错,只有2位小数。如果您想要浮点输出,那么这是您能做的最好的了。没什么问题。如果要打印它(字符串表示),那是另一个问题。因此,输出看起来很好,只有2位小数。如果要浮点输出,那么这是最好的了。没什么问题。如果要打印它(字符串表示),那是另一个问题。