📌
【Dart】switch文でdouble型は使えない
switch文の式にdouble型を指定すると、構文解析でエラーとなったのでメモ。
サンプルコード
double x = 1.0;
// これは大丈夫
if(x == 1.0) {
print(true);
} else {
print(false);
}
// -> true
// これも大丈夫
if(x == 1) {
print(true);
} else {
print(false);
}
// -> true
// これはNG
switch(x) {
case 1.0:
print(true);
break;
case 2.0:
print(false);
break;
default:
print('Not match');
}
// The switch case expression type 'double' can't override the == operator`
// ちなみにこうすれば大丈夫
switch(x.round()) { //roundメソッドは四捨五入を行う
case 1:
print(true);
break;
case 2:
print(false);
break;
default:
print('Not match');
}
原因
dartの仕様上、switch文の式ではdouble型とBoolean型は使えない(言語により異なる)
考察
なぜint(整数)型は使えるのに、double型は使えないんだ😤
不思議に思って調べてみると、double型は信頼性が低いとされていることが判明した。
こんな具合
double x = 0.1;
print(x.toStringAsFixed(20)); // -> 0.10000000000000000555
x = 0.3;
print(x.toStringAsFixed(20)); // -> 0.29999999999999998890
これは小数を2進数から10進数に変換する際に、誤差が生じるため起こるらしい。
よって、信頼性が低いものをswitch文で使うのを良しとしないという思想の元禁じられている。
間違っていたり補足出来る方がいれば、気軽にコメント頂けると大変喜びます!
Discussion