stefafafan の fa は3つです

"すてにゃん" こと id:stefafafan のブログです

Redash で扱える数字の精度について簡単にまとめる

最近社内でRedashを利用している。色んなデータソースにたいしてクエリを書くことができて便利です。
redash.io

ただ、たまに数字の出力で精度について気になることがあるのでブログにまとめておきます。

前提: Redashを開いているタブで開発者コンソールからネットワークの様子をみるとAPIからの結果が確認できる

まず前提として開発者コンソールを開いている状態でRedashのクエリを実行すると、APIが叩かれて結果が入っていることを確認できます。これを利用することによってAPIからの結果が丸まっているのか、表示時に丸めているのかが切り分けできます。

開発者コンソールの様子

こういうJSONが返ります。

{
    "query_result": {
        "id": 763493,
        "query": "select 1.12345678901234567890, 12345678901234567890 LIMIT 1000",
        "data": {
            "columns": [
                {
                    "name": "1.12345678901234567890",
                    "friendly_name": "1.12345678901234567890",
                    "type": "float"
                },
                {
                    "name": "12345678901234567890",
                    "friendly_name": "12345678901234567890",
                    "type": "integer"
                }
            ],
            "rows": [
                {
                    "1.12345678901234567890": 1.1234567890123457,
                    "12345678901234567890": 12345678901234567890
                }
            ]
        },
        "data_source_id": 9,
        "runtime": 0.0249264240264893,
        "retrieved_at": "2023-01-09T15:10:59.496Z"
    }
}

桁数の多い数字の場合の誤差

これについては以下のブログに詳細にまとまっています。

ariarijp.hatenablog.com

これは JavaScript 側の問題で、対処法は文字列として扱うことです。

Redash の UI 上で 9007199254740991 を超える数値を扱いたい場合は、精度が下がることを許容するか文字列として扱う

Redash 上で桁数が多い数値を表示すると発生する誤差について調べた - ariarijp’s blog

Open な issue はありますが進展はないので、文字列に変換してなんとかしています。

select cast(id as char(1000)) としたり、 select concat(id) とかでも文字列に変換されるみたいです。
github.com

大きい数字をSELECTしている様子

小数点2桁までで丸められる件

Redashをデフォルトの状態で利用していると小数点を含む数値については2桁までで四捨五入されます。

Redashで四捨五入されている様子

これに関しては Closed な issue があります。
github.com

これの原因も表示側で、同様に文字列として扱うようにすれば対応することができます。また、別の対応方法としては数字のVisualizationの設定でデフォルト2桁になっているところを桁数増やすことです。

Edit Visualization からカラムの設定を確認すると 0,0.00 になっているので、この値をたとえば 0,0.00000 にすれば5桁に増えます。

Visualizationから小数点以下の桁数を5桁に増やした様子

上記はクエリごとの設定なので、利用しているRedash全体でのデフォルトの表示形式を変更する手段は用意されていません。Open な issue がありますが、進展はなさそうです。
github.com

このへんにデフォルト設定の指定があるので、セルフホストしている場合などはここをパッチしてなんとかするやり方はあるかもしれません。
github.com

なお、Redashのこのフォーマットの形式についてはドキュメントを参照ください。 1,234 のカンマが邪魔だから省きたい、みたいなときにも使えます。
redash.io

Edit Visualization で小数点の桁数を変更しても、十数桁以上から結果がずれる

もし 0,0.0000000000000000 みたいに桁数増やしまくって使った場合に際限なく高精度なままで扱えるわけではなく、途中からずれていきます。

小数点以下の数値がある時点からずれている様子


これはAPIからの結果がそもそもこうなっています。サーバサイドではPythonが使われているようですが、Pythonに限らず同じように浮動小数点数を扱う言語ではこうなるのは自然だと思います。

docs.python.org

どうしても select 1.12345678901234567890 みたいなクエリで正確に最後の桁まで表示したい場合はやっぱり文字列としてキャストすることになります。

終わり

ということでRedashの数字周りの扱いについて簡単にまとめました。他にもTipsがあればTwitterブコメなどでお知らせください。