Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python 3四舍五入问题_Python 3.x_Rounding - Fatal编程技术网

Python 3.x Python 3四舍五入问题

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,

为什么下面的舍入在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,
 0: 0.29999999999999999,
 1: 0.57999999999999996,
 2: 0.10000000000000001,
 3: 0.01}

看起来很好用。请记住,
round
返回浮点数


它四舍五入到两位小数,但浮点数本质上是不精确的(对于几乎所有的数字),因此输出效果良好。

。请记住,
round
返回浮点数


它四舍五入为两位小数,但浮点数本质上是不精确的(对于几乎所有的数字),因此输出。

您使用的是NumPy
float64
对象,而不是Python
float
对象。这有几个后果:

  • 在Python 3上,
    float64
    对象使用NumPy的舍入代码而不是Python的舍入代码进行舍入。Python对
    float
    s的舍入代码总是给出正确的舍入结果。NumPy的舍入代码不存在。(在Python2上,不可能覆盖自定义类型的
    round
    操作,因此在Python2中对
    float64
    对象进行舍入时,首先将其转换为Python
    float
    ,然后使用Python的舍入代码给出一个
    float
    结果。这是您看到我们之间差异的主要原因en Python 2和Python 3。)

  • 同样在Python3上,由于上述原因,
    float64
    上的
    round
    给出了一个
    float64
    结果。在Python2上,
    float64
    对象上的
    round
    给出一个
    float
    结果

  • Python
    float
    对象具有不同的
    repr
    ,这将提供更令人愉快的输出。特别是Python的float
    repr
    保证了十进制值(不太大,也不太小)的往返,最多有15个有效数字:
    0.58
    的表示形式是
    '0.58'
    。NumPy
    float64
    对象的表示形式没有此属性:它只是根据存储值的最有效的17位小数打印出一个结果

  • 因此,如果您在回合之前将值转换为Python
    float
    对象,您将看到更令人愉快的输出(在某些情况下,结果可能更精确)。但是请注意,仅仅因为输出看起来不错,并不意味着您得到的结果是准确的。所有这些都没有改变这样一个事实,即
    0.58
    不能准确地表示为Python
    float
    (或者实际上是使用相同格式的NumPy
    float64
    )。记住,对于二进制浮点,看到的不是得到的

    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
    对象,而不是Python
    float
    对象。这有几个后果:

  • 在Python 3上,
    float64
    对象使用NumPy的舍入代码而不是Python的舍入代码进行舍入。Python对
    float
    s的舍入代码总是给出正确的舍入结果。NumPy的舍入代码不存在。(在Python2上,不可能覆盖自定义类型的
    round
    操作,因此在Python2中对
    float64
    对象进行舍入时,首先将其转换为Python
    float
    ,然后使用Python的舍入代码给出一个
    float
    结果。这是您看到我们之间差异的主要原因en Python 2和Python 3。)

  • 同样在Python3上,由于上述原因,
    float64
    上的
    round
    给出了一个
    float64
    结果。在Python2上,
    float64
    对象上的
    round
    给出一个
    float
    结果

  • Python
    float
    对象具有不同的
    repr
    ,这将提供更令人愉快的输出。特别是Python的float
    repr
    保证了十进制值(不太大,也不太小)的往返,最多有15个有效数字:
    0.58
    的表示形式是
    '0.58'
    。NumPy
    float64
    对象的表示形式没有此属性:它只是根据存储值的最有效的17位小数打印出一个结果

  • 因此,如果您在回合之前将值转换为Python
    float
    对象,您将看到更令人愉快的输出(在某些情况下,结果可能更精确)。但是请注意,仅仅因为输出看起来不错,并不意味着您得到的结果是准确的。所有这些都没有改变这样一个事实,即
    0.58
    不能准确地表示为Python
    float
    (或者实际上是使用相同格式的NumPy
    float64
    )。记住,对于二进制浮点,看到的不是得到的

    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位小数。如果要浮点输出,那么这是最好的了。没什么问题。如果要打印它(字符串表示),那是另一个问题。