I used to check int values in case statements but is there any way check double values too? I can't use If else. This is an assignment. Thank you.
-
1http://stackoverflow.com/questions/5141830/switch-expression-cant-be-float-double-or-boolean – elaid Feb 18 '15 at 16:12
3 Answers
yes, but it won't perform very well. This will work
// don't do this, unless you want readability not performance.
switch(Double.toString(d)) {
case "1.0":
break;
case "Infinity":
break;
}
Instead you should use a series of if/else statements or use a Map<Double, DoubleConsumer>
for a long list of doubles.
You can use a NavigableMap for efficient range searches.
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);
}

- 525,659
- 79
- 751
- 1,130
-
-
@user126494 in which case, readability may be more important than performance. Note: with double you are likely to need rounding or range searches. You can implement range searches with a `NavigableMap` – Peter Lawrey Feb 18 '15 at 16:19
-
Switch cases only take byte, short, char, and int. And a few other special cases. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

- 340
- 1
- 8
Since double
values provide an exact representation only in case when the value can be expressed as a sum of powers of 2 that located "close enough" to each other (within the length of mantissa), and because switch
works only with exact matches, you cannot use double
s in a switch in a general case.
The basic reason for it is the same as the need to be careful when using ==
to compare double
s. The solution is the same as well: you should use a chain of if
-then
-else
statements to find the desired value
if (a <= 0.2) {
...
} else if (a < 0.5) {
...
} else if (a < 0.9) {
...
} else {
...
}
or use a TreeMap<Double,Something>
and perform a limit search:
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;
}
}

- 714,442
- 84
- 1,110
- 1,523