質問するログイン新規登録

回答編集履歴

1

指摘を受け追記

2018/05/31 13:08

投稿

ikadzuchi
ikadzuchi

スコア3047

answer CHANGED
@@ -1,7 +1,17 @@
1
1
  (2進の)浮動小数点数の仕様です。
2
2
  10進数で切りの良い小数は2進浮動小数点数では正確に表せません。
3
- 例えば2.125は内部的に2.12499999のような値になるのでしょう。
3
+ ~~例えば2.125は内部的に2.12499999のような値になるのでしょう。~~ →追記参照
4
4
  偶数への丸めは無関係です。
5
5
  環境によってはdecimal型などの名前で10進浮動小数点数が使えますがどうやらSQLiteには無いようです。
6
6
  対処法としては正攻法ではそもそも入力データに小数を使わないようにすべきですが、
7
- 現状のデータのままでどうにかするなら取れる方法は「十分に小さい数を足してからroundする」くらいだと思います。
7
+ 現状のデータのままでどうにかするなら取れる方法は「十分に小さい数を足してからroundする」くらいだと思います。
8
+
9
+ ---
10
+ 追記:
11
+ 上のように書きましたが、コメントで指摘のあったように2.125は2進小数で厳密に表せる値でした。失礼しました。
12
+ ただ、状況は浮動小数点数の誤差によく似ているので、何らかの形で上記のような内容が関係している可能性はあります。
13
+
14
+ 調べてみると興味深い情報が見つかりました。
15
+ http://d.hatena.ne.jp/hnw/20131229
16
+ こちらの(本文ではなく)コメント欄にSQLiteの内部処理について、「0.005を足してから第3位以下を切り捨てることで四捨五入を実現」とあります。
17
+ これだと「0.005」の部分に誤差が含まれますので何桁でroundするかにより切り捨てか切り上げかが一定しないことになりそうで、ちょっと疑問が残ります。