当前位置: 首页 > 知识库问答 >
问题:

带浮点数的无极for循环

石正奇
2023-03-14

考虑以下代码

for (float i = 0f; i < int.MaxValue; i++)
{
    // Some code
}

它应该从0循环到int。MaxValue(231-1),但它没有。一旦i达到224i就不再工作了,原因我完全无法理解。

在VS的即时窗口中,我尝试了以下方法:

>i
16777216.0
>i + 1
16777216.0 // ???
>i == i + 1
false // as expected, but a lack of consistency with upper statement
>i + 2
16777218.0

为什么会这样?2241有什么特别之处?

共有1个答案

甄伟兆
2023-03-14

这是因为浮点精度。它基于IEEE浮点算法标准(IEEE 754)。阅读它以了解浮点是如何工作的。

简单地说,当一个浮点数本身存储了一个大值时;当前存储的数字和它可以存储的下一个数字之间的差值大于1,因此向其添加1不会增加其值。

如果您需要精确的十进制数,请改用十进制。
如果您需要大于int的整数值,请使用long。
如果您需要非常大的整数值,请使用BigIntger。

 类似资料:
  • 我创建了一个2D数组,需要将元素或映射到要打印的彩色像素。这就是我所拥有的。 像素数组,表示不同颜色的整数值 我测试了,它工作得很好。在中的每个for循环旁边都会弹出唯一的错误,其中声明: 此外,int刻度用于定位像素应该在的位置,并赋予其正确的大小

  • 问题内容: 我使用Twig,并且有一个带有如下键的数组: 我想在循环中获取键和内容以获取此数组的所有值。 我该如何解决这个问题? 问题答案: 我找到了答案:

  • 问题内容: Angular确实在其HTML指令中使用数字为for循环提供了一些支持: 但是,如果您的范围变量包含具有动态数字的范围,则您每次都需要创建一个空数组。 在控制器中 在HTML中 这行得通,但是这是不必要的,因为我们根本不会在循环中使用范围数组。有谁知道设置最小值/最大值的范围或常规值? 就像是: 问题答案: 我稍微调整了这个答案,想到了这个小提琴。 过滤器定义为: 重复使用如下:

  • 我正在尝试填充一个名为的组件中的数组,它是的数组。每个还有一个列表。 因此,目前,我正在处理两个api调用,它们是: 和 我使用获取所有进程,并首先填充数组。然后我使用每个的进程id来调用第二个API,以获取该进程的任务。 当前,我的代码看起来如下所示: 我知道我可以创建一个observables数组,并使用等待所有这些异步调用完成,但我希望能够为每个调用定义订阅回调函数,因为我需要对的引用。我有

  • 问题内容: 我的表中有以下列表。 我怎样才能得到小数点后的位数。 重复?: 我已经检查了现有的帖子,但是没有正确的方法来处理 数字 。 结果 编辑 :花了一些宝贵的时间后,我发现了一些相对简单的脚本来处理此问题。 问题答案: 我找到了一些简单的脚本(相对于我而言)来处理此问题。 此处仅用于处理不带小数部分的浮点数。如果没有没有小数部分的值,那么这很简单 希望对您有帮助。完整脚本如下