跳至內容
Astera Technology

負偏移為何落錯整數區間?

向零截取不等於取區間下界。

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

準備報表輸入

本例區間 k 代表 k≤值<k+1。轉 INTEGER 向零截取,負 1.2 變負一,卻應屬負二。只有原值比截取整數小才再減一,此例全是細小有限偏移。

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

假設輸入:offsets
編號數值
A-1.2
B1.2
C-1
下載可編輯 CSV ↓
完整建表及插入假設資料
CREATE TABLE offsets(id TEXT PRIMARY KEY,value REAL NOT NULL); INSERT INTO offsets VALUES('A',-1.2),('B',1.2),('C',-1.0);

比較錯誤及更正結果

錯誤 SELECT:重現問題
SELECT id,CAST(value AS INTEGER) AS bucket FROM offsets ORDER BY id;
錯誤查詢的逐行結果
編號區間下界
A-1
B1
C-1
下載可編輯 CSV ↓
更正 SELECT
SELECT id,CAST(value AS INTEGER)-CASE WHEN value<CAST(value AS INTEGER) THEN 1 ELSE 0 END AS bucket FROM offsets ORDER BY id;
更正查詢的逐行結果
編號區間下界
A-2
B1
C-1
下載可編輯 CSV ↓

負 1.2 在 [−2,−1),1.2 在 [1,2),正好負一仍在 [−1,0),更正保留整數邊界。

用新副本測邊界

加零,區間為零,不是負一。

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

邊界改動及更正查詢
INSERT INTO offsets VALUES('D',0);
SELECT id,CAST(value AS INTEGER)-CASE WHEN value<CAST(value AS INTEGER) THEN 1 ELSE 0 END AS bucket FROM offsets ORDER BY id;
邊界查詢的逐行結果
編號區間下界
A-2
B1
C-1
D0
下載可編輯 CSV ↓

正好負一為何不再減一?

查看參考答案

原值等於截取整數,小於條件為假;負的小數餘量才須落下一格。

相關資源