doubleタイプフィールドとsqlのorder byとgroup byの恩讐

1191 ワード

BI線のデータテストを担当したことがありますが、面白い問題がありました。毎回問題を分析して、最後まで調べるのはとても基本的な問題です。例えば、浮動小数点の種類は足し算の交換法則を満たしていません。
double a = value1;
double b = value2;
(a + b) != (b + a)
データ分析を行うSQLコードを共有します。
  • はテーブル構造があります。
  • 名を列する
    タイプ
    id
    BIGINT
    price
    Double
    order.id
    VRCHAR
    buyer_id
    VRCHAR
  • case 1データ抽出のsql:select sum(a)from test where id>1000 order by order_id;select sum(a)from test where id>1000以上の二つのsqlの結果は、データ量が増加するにつれて、許容可能な誤差範囲よりも大きくなります。
  • case 2今は姿勢を変えてもう一回来ます。select sum from(select sum(a)as columnual from test group by buyer table 1
      select sum(a) from test where id>1000
    
  • 結果はcase 1と同じで、違いはデータ量の増加とともに、許容可能な誤差範囲よりもはるかに大きい。
    この二つのケースの中で、二つの注意事項があります。
  • order byまたはgroup byは、元のデータの順序を変更する。
  • 浮動小数点数が交換則
  • を満たしていません。
    アプリケーション内のあるフィールドがお金に関する敏感なフィールドである場合、誤差範囲を制御するために1000を掛けたほうがいいです。
    最後に一つの面接実習生を共有する時、浮動小数点の問題について:C言語でプログラムを書いてください。二つの浮動小数点が等しいかどうかを判断します。
      //            ,    true,    false。
      bool isEqual(double a, double b) {
      if(abs(a-b) < 0.0000001) {
        return true;
      } else {
        return false;
      }
    }
    
    このプログラムはバグを隠しています。(a-b)オーバーフローの可能性があります。