如何在 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 仅适用于完全匹配,因此在一般情况下您不能在开关中使用 doubles。

其基本原因与使用==比较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;
    }
}