为什么Python中10.5除以2.1等于4

发布于 2025-01-10 01:01:03 字数 274 浏览 0 评论 0原文

我发现在 python 中,10.5 // 2.1 == 4.0 但 11.5 // 2.3 == 5.0。

我猜原因可能与计算机中浮点数的表示有关。但 10.5 和 11.5 都可以很好地表示,而 2.1 和 2.3 则不能。那么为什么结果不同呢?

屏幕截图

I found that in python, 10.5 // 2.1 == 4.0 but 11.5 // 2.3 == 5.0.

I guess the reason could be releated to the representing of float number in computer. But both 10.5 and 11.5 could be well represented while 2.1 and 2.3 cannot. So why the resule is different?

screen shot

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦过后 2025-01-17 01:01:03

我不太熟悉 python 的 C 源代码,但我认为 // 是通过以下方式实现的:

float_floor_div(PyObject *v, PyObject *w)
{
    double vx, wx;
    double mod, floordiv;
    CONVERT_TO_DOUBLE(v, vx);
    CONVERT_TO_DOUBLE(w, wx);
    if (wx == 0.0) {
        PyErr_SetString(PyExc_ZeroDivisionError, "float floor division by zero");
        return NULL;
    }
    _float_div_mod(vx, wx, &floordiv, &mod);
    return PyFloat_FromDouble(floordiv);
}

虽然我们可以深入研究 _float_div_mod(),但自从它看起来是 python 实现 divmod() 的基础,我刚刚尝试了这个:

divmod(10.5, 2.1)

给我:

(4.0, 2.0999999999999996)

所以,答案似乎被塞满了 浮点数学是否损坏?

I'm not really familiar with the C source of python, but poking about I think that // is implemented by:

float_floor_div(PyObject *v, PyObject *w)
{
    double vx, wx;
    double mod, floordiv;
    CONVERT_TO_DOUBLE(v, vx);
    CONVERT_TO_DOUBLE(w, wx);
    if (wx == 0.0) {
        PyErr_SetString(PyExc_ZeroDivisionError, "float floor division by zero");
        return NULL;
    }
    _float_div_mod(vx, wx, &floordiv, &mod);
    return PyFloat_FromDouble(floordiv);
}

While we could dive into _float_div_mod(), but since it looks to be the basis of python's implementation of divmod(), I just tried this:

divmod(10.5, 2.1)

Giving me:

(4.0, 2.0999999999999996)

So, the answer seems to be chocked up to Is floating point math broken?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文