如何在for循环而不是int中使用double?

时间:2017-05-05 21:14:22

标签: java for-loop

我想知道如何使for loop使用double变量,而不是int。 我尝试过的只生成double,但它基本上是一个int,其中包含" .0" 每个号码后面。

代码:

public static void FindTheDouble() {

    double LookFor = 2.29195;
                            //also tried adding a ".xxx" here
    for (double i = 1; i <= 5; i++) { //notice i is of type double
        System.out.println(i);
        if (i == LookFor) {
            System.out.println();
            System.out.println("Found the double: "+LookFor);
            break;          
        }   
    }
}

输出:

1.0
2.0
3.0
4.0
5.0
编辑:对不起,忘了说我在找什么。我正在寻找它通过&#34; .xxxxxxx&#34;,但只是得到了那个输出。

这是使用break声明的正确方法吗?感谢任何帮助,提前谢谢!

7 个答案:

答案 0 :(得分:1)

请放心,i double,但i永远不会是2.29195

double循环中使用for需要仔细考虑,因为重复向浮点添加常量会导致累积总数“熄灭”,因为从十进制到二进制的不精确转换。 (尝试使用i += 0.1作为增量并自己查看)。但是对于小整数,你绝对没问题,尽管使用double当然是毫无意义的。

如果您想以0.00001为单位有效计算,请使用类似

的内容
for (int i = 100000; i <= 500000; ++i){
    double f = i * 0.00001;
}

然后f与IEEE754 double允许的数字一样接近。

答案 1 :(得分:0)

您可以使用Math.floor(i * 100000) / 100000仅检查部分

double LookFor = 2.29195;

for (double i = 1.0; i <= 5.0; i += 0.00005) {
    System.out.println(i);
    if ((Math.floor(i * 100000) / 100000) == LookFor) {
        System.out.println();
        System.out.println("Found the double: " + LookFor);
        break;
    }
}

这个想法是:

不要使用所有双2.29195000000143进行测试,你必须只选择exacte部分Math.floor(2.29195000000143 * 100000) / 100000 = 2.29195,因为你没有输入你的if条件,因为你这样测试:

2.29195000000143 == 2.29195这会给你错误的结果。

答案 2 :(得分:0)

你想要每个0.000001走两个数字,直到找到2.29195,只需在每次互动时为我添加0.000001:

The 'Instance' member of the Entity Framework provider type 'Mono.Data.Sqlite.SqliteFactory, Mono.Data.Sqlite, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756' did not return an object that inherits from 'System.Data.Entity.Core.Common.DbProviderServices'.

不知道你想要实现什么,而不是使用double LookFor = 2.29195; for (double i = 1; i <= 5; i += 0.00001) { System.out.println(i); if (i == LookFor) { System.out.println(); System.out.println("Found the double: "+LookFor); break; } } } 你使用while子句:

break

最后,请考虑用户double LookFor = 2.29195; double i = 1; while(i != LookFor && i <= 5){ System.out.println(i); i += 0.00001; } System.out.println("Found the double: "+LookFor); 而不是double,以防止漂移浮动问题。

答案 3 :(得分:0)

你可以这样做:

 return hrs + ':' + (min < 10 ? '0' + min.toString() : min) + sec;

你的休息声明是正确的。

您的平等声明可能会因双打而失败。相反,你想做这样的事情:

public static void FindTheDouble() {

double LookFor = 2.29195;

for (double i = 1.0; i <= 5.0; i+=0.00005) {
    System.out.println(i);
       if (i == LookFor) {
           System.out.println();
           System.out.println("Found the double: "+LookFor);
           break;          
       }   
   }
}

double可以在扩展的小数位上具有无关值,这可能会影响相等比较的成功。相反,最好检查两个双精度值是否在您可接受的某种精度范围内。

答案 4 :(得分:0)

关于问题的最后部分,break语句终止最近的循环。例如,检查下面的代码段:

for(int i = 0; i < whatever; i++){
    for(int j = 4; j > 0; j--){
        if(i == j){
            break;
            }
         } //End of second for-loop
     } //End of first for-loop

上面代码中的break语句仅终止第二个for循环。您可以使用标签选择break语句中断的特定循环。假设我实际上想让break语句终止第一个循环,我只需要附加一个标签,如下所示:

here:
for(int i = 0; i < whatever; i++){
    for(int j = 4; j > 0; j--){
        if(i == j){
            break here;
            }
         } //End of second for-loop
     } //End of first for-loop

注意:您可以使用任何您想要的单词作为标签;你可以用任何单词替换'here',当然除了关键字。

答案 5 :(得分:0)

如果您不介意使用DoubleStream中的Java 8,可以尝试这样的方法,但请考虑以下几点:

  • 最大。小数点后的数字是7位数(我还没有对其进行测试)
  • 你想要的更精确,花费的时间越多。
  • 如果提供的精确度(即步骤)小于您正在搜索的目标双倍 - &gt;它找不到它(正常逻辑)。

    import java.text.DecimalFormat;
    import java.util.stream.DoubleStream;
    
    public class DoubleSearch {
    
    public static void main(String[] args){
        //Testing
        System.out.println(search(0.0000001, 5, 0.1)); // true
        System.out.println(search(0.0000001, 4, 0.01)); // true
        System.out.println(search(0.0000001, 3, 0.001)); //true
        System.out.println(search(0.0000001, 0.5, 0.0001)); //true
        System.out.println(search(0.0000001, 1.1, 0.00001)); //true
        System.out.println(search(0.0000001, 5.25, 0.0000001)); //true
        System.out.println(search(0.0000001, 2, 1.0001));
        System.out.println(search(0.1, 5, 4.0001)); // false because no enough precision provided (0.1)
        System.out.println(search(0.1, 2, 3)); // false as it's out of range
        System.out.println(search(0.00001, 5, 2.29195)); // your example returns true (i.e found)
    }
    
    public static boolean search(double step, double max, double target){
        return DoubleStream.iterate(0, d-> d+step).limit((long)(max/step)).anyMatch(p-> 
                        Double.compare(Double.valueOf(new DecimalFormat("#.#######").format(p)),
                        Double.valueOf(new DecimalFormat("#.#######").format(target)))==0); 
    }
    
    }
    

<强>输出:

true
true
true
true
true
true
true
false
false
true

答案 6 :(得分:0)

现在,检查下面的代码片段:

action:
//loop 1
for(int i = 0; i < 10; i++){
    //loop 2
    for(int j = 0; j < 10; j++){
        if(i == (j - 2)){
            break action;
               }
      }
   }

在上面的代码中,如果满足内部for循环中的条件,则第一个循环会中断,因为标签声明( action:)就在第一个循环之前。

现在,看看这个:

//loop 1
for(int i = 0; i < 10; i++){
    //loop 2
    action:
    for(int j = 0; j < 10; j++){
        if(i == (j - 2)){
            break action;
               }
      }
   }

显然,在这种情况下,如果符合条件,它就会被打破。

最后,标签没有固定的关键字,你可以使用你喜欢的任何名字(雷,火,超人,任何东西),你也可以在你的代码中声明多个标识符。我希望这有帮助..快乐编码!