跳至內容
Astera Technology

整數計數轉 REAL,為何少一個單位?

在已訂範圍內保留整數精確合計。

下載完整個案資料及參考答案 ↓

準備報表輸入

本例極端數據把整數 9007199254740992 加一,合計仍在有號 64 位範圍內。先乘 1.0 轉 REAL 會丟一,應保整數 SUM,最後為大值傳送轉文字。

以下記錄及報表規則均為原創假設。在新 SQLite 測試資料庫重做建表,預覽包含此小型例子每張表。

假設輸入:counters
編號整數單位(文字預覽)
A9007199254740992
B1
下載可編輯 CSV ↓
完整建表及插入假設資料
CREATE TABLE counters(id TEXT PRIMARY KEY,ticks INTEGER NOT NULL); INSERT INTO counters VALUES('A',9007199254740992),('B',1);

比較錯誤及更正結果

錯誤 SELECT:重現問題
SELECT CAST(CAST(SUM(1.0*ticks) AS INTEGER) AS TEXT) AS total_ticks FROM counters;
錯誤查詢的逐行結果
合計單位文字
9007199254740992
下載可編輯 CSV ↓
更正 SELECT
SELECT CAST(SUM(ticks) AS TEXT) AS total_ticks FROM counters;
更正查詢的逐行結果
合計單位文字
9007199254740993
下載可編輯 CSV ↓

錯誤文字合計尾數 992,正確 993。輸入預覽也把單位轉文字,避免 JavaScript 數字轉換混掉顯示整數。

用新副本測邊界

加整數負一,更正合計回 9007199254740992。

另開新資料庫重做原建表,才套下列改動及更正查詢。空結果在表內用已標明空結果文字表示,不是假資料行。

邊界改動及更正查詢
INSERT INTO counters VALUES('C',-1);
SELECT CAST(SUM(ticks) AS TEXT) AS total_ticks FROM counters;
邊界查詢的逐行結果
合計單位文字
9007199254740992
下載可編輯 CSV ↓

基礎合計應傳哪個精確值?

查看參考答案

文字 "9007199254740993"。此界內整數合計精確,損失源於 REAL 轉換;更大合計須另測溢出處理。

相關資源

系統整合服務 →