3

考虑 Python 中的以下代码片段:

m = int(math.sqrt(n))

对于 n = 25,它应该给出 m = 5(它在我的 shell 中也是如此)。但是根据我的 C 经验,我知道使用这样的表达式是一个坏主意,因为 sqrt 函数可能返回比实际值略低的值,然后在四舍五入后我可能会得到 m = 4 而不是 m = 5。这个限制也是参与python?如果是这种情况,在 python 中编写此类表达式的最佳方法是什么?如果我使用 Java 或 C# 会发生什么?此外,如果有任何不准确之处,是什么因素控制着它的数量?

4

3 回答 3

7

对于适当的四舍五入,使用round(); 它四舍五入到最接近的整数,但返回一个浮点数。然后你可以int从结果中构造一个。

(很可能您的代码不是性能关键,您永远不会注意到与round().

于 2012-08-13T07:03:45.473 回答
3

如果您非常关心 的准确性sqrt,您可以使用标准库中的decimal.Decimal 类,它提供了自己的sqrt功能。该类Decimal可以设置为比常规 Python 更高的精度float。也就是说,无论如何你是否四舍五入可能并不重要。该类Decimal产生确切的数字(来自文档):

[十进制] 的精确性延续到算术中。在十进制浮点数中, 0.1 + 0.1 + 0.1 - 0.3正好等于零。在二进制浮点中,结果是5.5511151231257827e-017. 虽然接近于零,但差异会阻止可靠的相等性测试,并且差异会累积。因此,在具有严格等式不变量的会计应用程序中,十进制是首选。

于 2012-08-13T07:08:46.793 回答
2

解决方案很简单。如果您期望整数结果,请使用 int(math.sqrt(n)+.1)。如果该值比整数结果多一点或少一点,它将四舍五入到正确的值。

于 2012-08-13T06:57:20.760 回答