【问题标题】:Java iterator in double value双值的Java迭代器
【发布时间】:2012-11-08 19:54:51
【问题描述】:

我正在尝试将 I 的值从 1 迭代到 0 或从 0 到 1。但我遇到了一些问题。 请检查以下代码:

double i = 1.0;
loop{  // Just use a loop to iterate the i. This is just a pseudocode. 
       // We can use while-loop or for-loop or timer. 
       // (I know there is no keyword "loop" in java)

   i -=0.1;

   if( i == 0.0){
     // stop the loop
   }
}

在上面的代码中,循环永远不会停止,因为在循环期间当 i = 0.8 - 0.1 时变量 i 将变为 0.7000000001。当 i = 0.1 - 0.1 时,我将有很多十进制数。所以它永远不会等于 0.0。

如果我对问题的描述对您来说不够清楚,我深表歉意。 对于专业程序员来说,这可能是一个非常简单的问题。但我无法弄清楚。请让我知道我做错了什么。

【问题讨论】:

  • if (i <= 0) 最终会结束 - 但它可能会循环 10 或 11 次,具体取决于精度。更多关于双精度(缺乏)的信息:stackoverflow.com/questions/4937402/…
  • 您的担心是正确的。但是你的具体问题是什么?
  • 您不能使用doublefloat 精确表示浮点值。因此,您使用的 0.11.0 不是精确表示。您应该使用BigDecimal 来获得浮点数的精确表示。
  • @assylias 是正确的,它循环了 11 次然后到达 0。但我也不太明白这个问题。
  • @RohitJain:表示doublefloat浮点型类型。 BigDecimal浮点小数点 类型。因此,例如,十进制 数字 0.5(即一半)在二进制中是 0.1,并且可以精确表示。 “浮点”只是使用两个整数值的任何表示:一个尾数和一个指数来移动“点”。

标签: java math loops double iteration


【解决方案1】:

我会推荐使用 BigDecimal。
我知道 BigDecimal 用于金融系统,而不是 Double 或 Float,用于描述带有小数点的精确数字(即价格)。

阅读更多here

【讨论】:

    【解决方案2】:

    您为什么不喜欢从 1...10 迭代并将当前值除以 10? 像这样的:

    for(int i = 0; i <= 10; i++) {
       double value = (double) i / 10d;
    }
    

    或者,如果您不想遇到精度问题,您可以使用 BigDecimal:

    BigDecimal value = BigDecimal.ZERO;
    
    for(int i = 0; i <= 10; i++) {
       value = value.add(BigDecimal.valueOf(0.1d));
       double doubleVal = value.doubleValue();
    }
    

    【讨论】:

    • 实际上这里的所有答案都教会了我我不知道的东西并解决了我的问题。但是,你的是最清楚的。我很感激。
    【解决方案3】:

    使用整数进行迭代并适当缩放。

    i = 10;
    while (i != 0)
    {
        double d = i / 10.0;
        // do stuff with d
    
        i--;
    }
    

    即使比例因子不能用十进制表示,这也可以工作。

    使用BigDecimal 仅适用于小数。例如,如果您想以三分之一的步长进行迭代,它将无法工作。

    【讨论】:

      猜你喜欢
      • 2015-07-14
      • 2015-07-13
      • 2016-09-27
      • 2015-06-26
      • 2011-10-24
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多