📌

【Dart】switch文でdouble型は使えない

2020/12/02に公開

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