最近社内でRedashを利用している。色んなデータソースにたいしてクエリを書くことができて便利です。
redash.io
ただ、たまに数字の出力で精度について気になることがあるのでブログにまとめておきます。
- 前提: Redashを開いているタブで開発者コンソールからネットワークの様子をみるとAPIからの結果が確認できる
- 桁数の多い数字の場合の誤差
- 小数点2桁までで丸められる件
- Edit Visualization で小数点の桁数を変更しても、十数桁以上から結果がずれる
- 終わり
前提: 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" } }
桁数の多い数字の場合の誤差
これについては以下のブログに詳細にまとまっています。
これは JavaScript 側の問題で、対処法は文字列として扱うことです。
Redash の UI 上で 9007199254740991 を超える数値を扱いたい場合は、精度が下がることを許容するか文字列として扱う
Redash 上で桁数が多い数値を表示すると発生する誤差について調べた - ariarijp’s blog
Open な issue はありますが進展はないので、文字列に変換してなんとかしています。
select cast(id as char(1000))
としたり、 select concat(id)
とかでも文字列に変換されるみたいです。
github.com

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

これに関しては Closed な issue があります。
github.com
これの原因も表示側で、同様に文字列として扱うようにすれば対応することができます。また、別の対応方法としては数字のVisualizationの設定でデフォルト2桁になっているところを桁数増やすことです。
Edit Visualization
からカラムの設定を確認すると 0,0.00
になっているので、この値をたとえば 0,0.00000
にすれば5桁に増えます。

上記はクエリごとの設定なので、利用しているRedash全体でのデフォルトの表示形式を変更する手段は用意されていません。Open な issue がありますが、進展はなさそうです。
github.com
このへんにデフォルト設定の指定があるので、セルフホストしている場合などはここをパッチしてなんとかするやり方はあるかもしれません。
github.com
なお、Redashのこのフォーマットの形式についてはドキュメントを参照ください。 1,234
のカンマが邪魔だから省きたい、みたいなときにも使えます。
redash.io
Edit Visualization で小数点の桁数を変更しても、十数桁以上から結果がずれる
もし 0,0.0000000000000000
みたいに桁数増やしまくって使った場合に際限なく高精度なままで扱えるわけではなく、途中からずれていきます。

これはAPIからの結果がそもそもこうなっています。サーバサイドではPythonが使われているようですが、Pythonに限らず同じように浮動小数点数を扱う言語ではこうなるのは自然だと思います。
どうしても select 1.12345678901234567890
みたいなクエリで正確に最後の桁まで表示したい場合はやっぱり文字列としてキャストすることになります。