iT邦幫忙

1

MS SQL之下,用語法查詢及點右鍵編輯呈現出來的數字不一致

  • 分享至 

  • xImage

想請問大家有遇過以下狀況嗎?

我工具是使用MS SQL

我有一個A1的欄位某筆資料…裡面數字是78.3000001

然後我下select * from ATable的時候,出現的是78.3
但是,當我到ATable內按右鍵編輯的時候,出現的確是78.3000001

請問有前輩有遇過這狀況嗎??是否可以解答呢?

1、若我想下select去查到底有多少筆類似78.3000001的話,語法該如何下?
2、這種狀況的話,是工具的問題嗎??該如何解決呢?

再麻煩各位了,若資料有不足之處,我可以再補充,謝謝!

看更多先前的討論...收起先前的討論...
froce iT邦大師 1 級 ‧ 2023-02-09 10:19:04 檢舉
IEEE 754

https://ithelp.ithome.com.tw/questions/10189571
player iT邦大師 1 級 ‧ 2023-02-09 10:23:07 檢舉
A1的資料類型,該不會是float或real吧?
為了避免誤差,建議一開始就用decimal或 numeric
klm2242 iT邦研究生 1 級 ‧ 2023-02-09 10:39:40 檢舉
謝謝player及force回覆
1、A1是float沒錯…請問目前狀況無法改decimal或 numeric的話,我要怎麼查出78.3000001到底有幾筆呢??
2、目前我想到的方式是下LEN去查,但查不到東西。
3、為何float會有這狀況呢??
jakeuj iT邦新手 5 級 ‧ 2023-02-10 11:09:59 檢舉
所以這欄位存了甚麼資料?
klm2242 iT邦研究生 1 級 ‧ 2023-02-15 09:13:06 檢舉
存了數字,然後是float
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
JamesDoge
iT邦高手 1 級 ‧ 2023-02-10 07:47:51
最佳解答

想請問大家有遇過以下狀況嗎?

我工具是使用MS SQL

我有一個A1的欄位某筆資料…裡面數字是78.3000001

然後我下select * from ATable的時候,出現的是78.3
但是,當我到ATable內按右鍵編輯的時候,出現的確是78.3000001

請問有前輩有遇過這狀況嗎??是否可以解答呢?

1、若我想下select去查到底有多少筆類似78.3000001的話,語法該如何下?

SELECT * FROM ATable WHERE A1 = 78.3000001;

2、這種狀況的話,是工具的問題嗎??該如何解決呢?

這是因為SQL Server在顯示數值時會進行四捨五入,因此某些數字在顯示時可能會被修改。

可以使用精確的數值類型,例如 DECIMAL(38, 18) 或 NUMERIC(38, 18) 代替 FLOAT 或 REAL 類型,以確保存儲的數值不會被修改。

SELECT CAST(A1 AS DECIMAL(38, 18)) AS A1_Formatted FROM ATable;

或 使用 STR() 函數來強制轉換數值為字串:

SELECT STR(A1, 30, 18) AS A1_Formatted FROM ATable;
klm2242 iT邦研究生 1 級 ‧ 2023-02-15 09:14:09 檢舉

謝謝前輩,我後來用以下指令TRY,有跑出我想要的資料了。
SELECT CAST(A1 AS DECIMAL(38, 18)) AS A1_Formatted FROM ATable;

3
實習工程師
iT邦新手 1 級 ‧ 2023-02-09 11:02:56

1、若我想下select去查到底有多少筆類似78.3000001的話,語法該如何下?

CREATE TABLE #ATable (
	A1  float
)

INSERT INTO #ATable(A1) VALUES(78.3000001)
SELECT * FROM #ATable WHERE CONVERT(decimal(20,1),A1)  = 78.3

DROP TABLE #ATable

==================================================================

3、為何float會有這狀況呢??

參考文件 : https://blog.greglow.com/2018/01/15/sql-newbie-mistake-1-using-float-instead-decimal/

==================================================================

請問目前狀況無法改decimal或 numeric的話

不過如果您的欄位是用於 金額 計算的話...避免夜長夢多 建議還是用 decimal 型態

看更多先前的回應...收起先前的回應...
klm2242 iT邦研究生 1 級 ‧ 2023-02-09 11:40:33 檢舉

謝謝您的回覆
目前我想下select * from ATable先查出來到底A1有多少78.3000001類似的值…至少先找出來後,再提供給使用者,請問語法上有何參考的呢??

froce iT邦大師 1 級 ‧ 2023-02-09 13:08:02 檢舉

直接convert或cast就好,你用float都會遇到,最好的方式就是通通轉換或乾脆多一欄,一次轉換過去。

(已刪除)

(已刪除)

(已刪除)

目前我想下select * from ATable先查出來到底A1有多少78.3000001類似的值…至少先找出來後,再提供給使用者,請問語法上有何參考的呢??

CREATE TABLE #ATable (
	A1  float
)

INSERT INTO #ATable(A1) VALUES( 78.3000001)

SELECT
	*
FROM (
	SELECT 
		SUBSTRING(STR(A1,20,7),CHARINDEX('.',STR(A1,20,7))+2,LEN(STR(A1,20,7))) AS Test
		,A1
	FROM #ATable 
)AS Temp
WHERE Test!='000000'


DROP TABLE #ATable

範例資料 : 78.3000001
取得 000001 判斷 非 000000 的資料,就是你要的答案了。

klm2242 iT邦研究生 1 級 ‧ 2023-02-09 14:31:54 檢舉

謝謝前輩的資訊,我試一下…

1

一般像這樣的數值。在大多數的任何應用及軟體都會碰到過。
主因也是因為「浮點數值」(是不是這個名詞不太清楚了)

其原因也是因為電腦其實是很笨的。認真來說程式只會加法。
所以只要是其它運算都是用特別的方式,像是補位、進位.....(太多名詞看誰會補充,我是沒記那麼多)

所以在一般小數點運算中,並無法得到實際正確的值。
一般程式上的做法都是會經由再運算輸出處理。已防止出現這種「浮點數值」

其原因好像也跟2進位是有關係。早期我是有看過這一類文章。
但實在太過艱難理解了。所以只知些許。但我講不出大道理。
就看誰能補充了。

froce iT邦大師 1 級 ‧ 2023-02-09 14:01:31 檢舉

這個其實記結果就好,反正就是10進制浮點數要轉換成IEEE 754,2進制表示法不能完全轉換,會有誤差。

要簡單的說就要從浮點數的表示開始:
假設一個10進制的浮點數:

0.75 = 7 * 10^-1 + 5 * 10^-2
(7*0.1 + 5*0.01)

那用2進制表示

1* 2^-1 + 1*2^-2
(1*0.5 + 1*0.25)

所以0.75可以用2進制完全表示。

但0.76呢?你很難用2進制表示剩下的0.01,沒辦法用2的冪次表示,只能不斷的切割下去:

0.01(10進位) = 1 * 0.0078125 + ...
0.0078125(2^-7)
klm2242 iT邦研究生 1 級 ‧ 2023-02-15 09:15:25 檢舉

謝謝前輩

我要發表回答

立即登入回答