如何在 java 中的 case 语句中输入 Double 值
How to enter Double values in case statement in java
我过去常常检查 case 语句中的 int 值,但有什么方法也可以检查 double 值吗?我不能使用 If else。这是一个任务。谢谢。
是的,但效果不会很好。这会起作用
// don't do this, unless you want readability not performance.
switch(Double.toString(d)) {
case "1.0":
break;
case "Infinity":
break;
}
相反,您应该使用一系列 if/else 语句或使用 Map<Double, DoubleConsumer>
来表示一长串双打。
您可以使用 NavigableMap 进行高效的范围搜索。
NavigableMap<Double, DoubleConsumer> map = new TreeMap<>();
// default value is an assertion error
map.put(Double.NEGATIVE_INFINITY, d -> new AssertionError(d));
double upperBound = 12345;
map.put(upperBound, d -> new AssertionError(d));
// if >= 1.0 then println
map.put(1.0, System.out::println);
public static void select(NavigableMap<Double, DoubleConsumer> map, double d) {
Map.Entry<Double, DoubleConsumer> entry = map.floorEntry(d);
entry.getValue().accept(d);
}
Switch case 只接受 byte、short、char 和 int。以及其他一些特殊情况。
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
由于 double
值仅在值可以表示为彼此位于 "close enough" 的 2 的幂之和(在尾数长度内)的情况下才提供精确表示,并且由于 switch
仅适用于完全匹配,因此在一般情况下您不能在开关中使用 double
s。
其基本原因与使用==
比较double
时需要注意是一样的。解决方案也一样:您应该使用一系列 if
-then
-else
语句来找到所需的值
if (a <= 0.2) {
...
} else if (a < 0.5) {
...
} else if (a < 0.9) {
...
} else {
...
}
或使用 TreeMap<Double,Something>
并执行限制搜索:
TreeMap<Double,Integer> limits = new TreeMap<Double,Integer>();
limits.put(0.2, 1);
limits.put(0.5, 2);
limits.put(0.9, 3);
...
Map.Entry<Double,Integer> e = limits.ceilingEntry(a);
if (e != null) {
switch(e.getValue()) {
case 1: ... break;
case 2: ... break;
case 3: ... break;
}
}
我过去常常检查 case 语句中的 int 值,但有什么方法也可以检查 double 值吗?我不能使用 If else。这是一个任务。谢谢。
是的,但效果不会很好。这会起作用
// don't do this, unless you want readability not performance.
switch(Double.toString(d)) {
case "1.0":
break;
case "Infinity":
break;
}
相反,您应该使用一系列 if/else 语句或使用 Map<Double, DoubleConsumer>
来表示一长串双打。
您可以使用 NavigableMap 进行高效的范围搜索。
NavigableMap<Double, DoubleConsumer> map = new TreeMap<>();
// default value is an assertion error
map.put(Double.NEGATIVE_INFINITY, d -> new AssertionError(d));
double upperBound = 12345;
map.put(upperBound, d -> new AssertionError(d));
// if >= 1.0 then println
map.put(1.0, System.out::println);
public static void select(NavigableMap<Double, DoubleConsumer> map, double d) {
Map.Entry<Double, DoubleConsumer> entry = map.floorEntry(d);
entry.getValue().accept(d);
}
Switch case 只接受 byte、short、char 和 int。以及其他一些特殊情况。 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
由于 double
值仅在值可以表示为彼此位于 "close enough" 的 2 的幂之和(在尾数长度内)的情况下才提供精确表示,并且由于 switch
仅适用于完全匹配,因此在一般情况下您不能在开关中使用 double
s。
其基本原因与使用==
比较double
时需要注意是一样的。解决方案也一样:您应该使用一系列 if
-then
-else
语句来找到所需的值
if (a <= 0.2) {
...
} else if (a < 0.5) {
...
} else if (a < 0.9) {
...
} else {
...
}
或使用 TreeMap<Double,Something>
并执行限制搜索:
TreeMap<Double,Integer> limits = new TreeMap<Double,Integer>();
limits.put(0.2, 1);
limits.put(0.5, 2);
limits.put(0.9, 3);
...
Map.Entry<Double,Integer> e = limits.ceilingEntry(a);
if (e != null) {
switch(e.getValue()) {
case 1: ... break;
case 2: ... break;
case 3: ... break;
}
}