【问题标题】:"For" loops increment not working correctly. Why?“For”循环增量无法正常工作。为什么?
【发布时间】:2011-07-28 10:03:50
【问题描述】:
for (float i = -1; i <= 1; i+=0.1f)   
{
    Console.WriteLine(i);   
}

这是结果

-1
-0.9
-0.8
-0.6999999
-0.5999999
-0.4999999
-0.3999999
-0.2999999
-0.1999999
-0.09999993
7.450581E-08
0.1000001
0.2000001
0.3000001
0.4000001
0.5000001
0.6000001
0.7000001
0.8000001
0.9000002

【问题讨论】:

  • 欢迎来到饱经战火的浮点世界。
  • 一个常见问题,尽管通常采用“float is broken!”的形式。浮点数(或双精度数)不准确,试试0.1 + 0.2 == 0.3,它是错误的!
  • 嗯,实际上,它的工作方式完全符合预期。
  • 您可以循环从 -10 到 10 的整数,增量为 1,然后在循环内除以 10(将​​整数转换为浮点数)以使其工作。

标签: c# .net loops floating-point


【解决方案1】:

因为浮点数不是精确的十进制数,而是浮点数。请改用小数。

参见维基百科:Wikipedia

【讨论】:

  • 当然,一旦他想增加 1/3,即使使用 Decimal,他也会遇到同样的问题
【解决方案2】:

Float 和 double 无法准确显示十进制值。看看 wikipedia 是如何实现的。

您可能想改用Decimal

【讨论】:

  • Decimal also 不是“精确的”——但它使用了一种人类更熟悉的不同近似方法。但两者都一样“准确”(或不准确)
【解决方案3】:

【讨论】:

    【解决方案4】:

    使用整数进行索引。如果您需要循环内的浮点值,请在此处计算:

    for (int i = -10; i <= 10; i++)   
    {
        Console.WriteLine(i / (float) 10);   
    }
    

    【讨论】:

    • 它运作良好,但谁能解释它是如何运作的?
    • @JunedKhanMomin 对于从 -10 到 10(含)的每个整数,将其除以浮点数 10。此除法的结果(整数除以浮点数)是一个浮点数,即打印到控制台。在索引中使用整数可以让您从处理浮点数舍入中解脱出来。
    【解决方案5】:

    float 表示 32 位 floating point number。它不能准确地表示这些值。这是另一篇关于 .NET 浮点的必读文章:http://csharpindepth.com/Articles/General/FloatingPoint.aspx

    【讨论】:

    • -1:“它不能准确地表示这样的small值”是什么意思?如果不能代表-0.7,是不是很没用?
    • @ANeves,float 不能准确表示 -0.7(请阅读其中一篇链接文章)。不,它不是没用的,因为它允许我们进行计算,对于许多场景来说“足够准确”,并且可以快速完成。如果使用浮点数,则应确定计算所需的精度。如果需要精确的精度,可以使用诸如decimal 之类的定点类型,尽管它更大(128 位)并且允许的值范围更小。
    • @driis 与链接现在是一个很好的答案;但它已经太久了,所以我不能取消投票。我需要学会在投票前等待 5 分钟。 :|
    • @driis decimal 并不比 float/double 更“精确”(注意我在这里忽略了 precision - 并专注于 exact ) - 简单;近似发生在以 10 为底的空间中,人类对此更为熟悉。
    • @Marc,同意。 (我不是以英语为母语的人,所以我可能会混淆一些术语)。
    【解决方案6】:

    这是因为您使用的是浮点数。浮点数的计算并不完全正确,因为您的计算机内部使用的是二进制数而不是十进制数。关于这个问题的好信息在这里:http://floating-point-gui.de/

    【讨论】:

      猜你喜欢
      • 2019-11-16
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 2020-01-30
      • 1970-01-01
      相关资源
      最近更新 更多