準備報表輸入
本例極端數據把整數 9007199254740992 加一,合計仍在有號 64 位範圍內。先乘 1.0 轉 REAL 會丟一,應保整數 SUM,最後為大值傳送轉文字。
以下記錄及報表規則均為原創假設。在新 SQLite 測試資料庫重做建表,預覽包含此小型例子每張表。
| 編號 | 整數單位(文字預覽) |
|---|---|
| A | 9007199254740992 |
| B | 1 |
CREATE TABLE counters(id TEXT PRIMARY KEY,ticks INTEGER NOT NULL); INSERT INTO counters VALUES('A',9007199254740992),('B',1);比較錯誤及更正結果
SELECT CAST(CAST(SUM(1.0*ticks) AS INTEGER) AS TEXT) AS total_ticks FROM counters;| 合計單位文字 |
|---|
| 9007199254740992 |
SELECT CAST(SUM(ticks) AS TEXT) AS total_ticks FROM counters;| 合計單位文字 |
|---|
| 9007199254740993 |
錯誤文字合計尾數 992,正確 993。輸入預覽也把單位轉文字,避免 JavaScript 數字轉換混掉顯示整數。
用新副本測邊界
加整數負一,更正合計回 9007199254740992。
另開新資料庫重做原建表,才套下列改動及更正查詢。空結果在表內用已標明空結果文字表示,不是假資料行。
INSERT INTO counters VALUES('C',-1);
SELECT CAST(SUM(ticks) AS TEXT) AS total_ticks FROM counters;| 合計單位文字 |
|---|
| 9007199254740992 |
基礎合計應傳哪個精確值?
查看參考答案
文字 "9007199254740993"。此界內整數合計精確,損失源於 REAL 轉換;更大合計須另測溢出處理。