代码之家  ›  专栏  ›  技术社区  ›  Vizag

从Float转换为Int更改了输出

  •  1
  • Vizag  · 技术社区  · 5 年前

    我定义了一个简单的 sqrt 函数计算给定数字的平方根。

    def sqrt(n):
        low = 0
        up = n  
        for i in range(50):
            mid = float(low+up)/2
            if pow(mid,2) < n:
                low = mid
            elif pow(mid,2) > n:
                up = mid
            else:
                break
        return mid
    

    当我这样做时:

    print(sqrt(9))

    我明白了 3.0 作为输出。但是当我这样做的时候:

    print(int(sqrt(9))) 我明白了 2 .

    有人能帮我理解为什么会这样吗?

    谢谢您。

    3 回复  |  直到 5 年前
        1
  •  2
  •   MadaManu    5 年前

    是因为四舍五入。方法定义实际上计算 sqrt(9) 成为 2.9999999999999973 . 但是,舍入不适用于铸造,因此在铸造 int(2.9999999999999973) . 当您直接打印时,python应用舍入,使该值达到3。

    Python2.7输出:

    Python 2.7.17 (v2.7.17:c2f86d86e6, Oct 19 2019, 21:01:17) [MSC v.1500 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    >>> def sqrt(n):
    ...     low = 0
    ...     up = n
    ...     for i in range(50):
    ...         mid = float(low+up)/2
    ...         if pow(mid,2) < n:
    ...             low = mid
    ...         elif pow(mid,2) > n:
    ...             up = mid
    ...         else:
    ...             break
    ...     return mid
    ...
    >>> sqrt(9)
    2.9999999999999973
    >>> print(sqrt(9))
    3.0
    >>> print(int(sqrt(9)))
    2
    >>>
    
        2
  •  2
  •   Kristada673    5 年前

    事实上, sqrt(9) 回报 2.9999999999999973 [1] ,至少在Python版本中 3.5 (或许所有版本 3.x ?)。和 int 只返回数字的整数部分。所以你才会 2 因此,作为 2.9999999999999973 是真的 2个 .

    如果要将结果舍入到最接近的整数,可以 round(sqrt(9)) 产生 3 .

    [1] 要了解发生这种情况的原因以及如何解决此问题,可以参考 this post .

        3
  •  0
  •   Vaibhav Jadhav    5 年前

    如果你想转换成 int 您可以使用以下选项:

    print(int(round(sqrt(9))))