我想知道如何使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
声明的正确方法吗?感谢任何帮助,提前谢谢!
答案 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
,可以尝试这样的方法,但请考虑以下几点:
如果提供的精确度(即步骤)小于您正在搜索的目标双倍 - &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;
}
}
}
显然,在这种情况下,如果符合条件,它就会被打破。
最后,标签没有固定的关键字,你可以使用你喜欢的任何名字(雷,火,超人,任何东西),你也可以在你的代码中声明多个标识符。我希望这有帮助..快乐编码!