我在我的選擇查詢列A +列B +列C中一起添加了3列。對於大多數列,數學顯示爲正確。但是,答案應該爲0的某些列會顯示爲1.36424205265939E-12或類似的內容。顯示0爲1.36424205265939E-12的SQL查詢
例如:我的數學是0 + 1414 + -1414。答案應該是0,但我得到的結果是1.36424205265939E-12。
我所有的數據類型都是浮點數。列B和C來自臨時表,列A來自常規表。
我在我的選擇查詢列A +列B +列C中一起添加了3列。對於大多數列,數學顯示爲正確。但是,答案應該爲0的某些列會顯示爲1.36424205265939E-12或類似的內容。顯示0爲1.36424205265939E-12的SQL查詢
例如:我的數學是0 + 1414 + -1414。答案應該是0,但我得到的結果是1.36424205265939E-12。
我所有的數據類型都是浮點數。列B和C來自臨時表,列A來自常規表。
您可以將算術前後的值轉換爲小數。例如:
select cast(Column A + Column B + Column C as decimal(28, 6))
應該足以滿足大多數目的。
這就是爲什麼當你真的需要浮點運算時你應該只使用浮點數。對於大多數用途 - 特別是在商業中 - 定點算法更合適。
歡迎來到浮點數的世界。
如果兩個浮點數完全相等,這是一個小小的奇蹟。這是因爲浮點運算僅在數值上精確到名爲machine epsilon的容差範圍內。
人們從事分子結構科學和做天文學的人可以使用相同的計算系統。
當您顯示浮點數時,使用the ROUND()
function通常很有幫助。例如,
SELECT ROUND(0.0 + 1414.0 + -1414.0, 2)
如果您不瞭解浮點數,請了解它們。如果你將在編程界工作,那麼瞭解該領域的基礎知識是必要的。
它帶來了從1994年
英特爾公司介意一個老笑話剛剛成功推出的微處理器(我們大多數人在2017年現在使用)的新奔騰線。第一個奔騰有a defect in their floating point arithmetic, in which certain computations were inaccurate by more than machine epsilon。儘管如此,它還是成功推出了產品,併爲英特爾的主席Andrew Grove賺了很多錢。
因此,安迪格羅夫走進一家酒吧。他感覺很不錯,所以他對酒保說:「給我一杯最好的蘇格蘭威士忌。」
酒保給他27歲的蘇格蘭威士忌的三個手指,並說,「這將是20美元,先生。」
Grove在酒吧放了一張20美元的鈔票,看了一會兒,並說「保持變化」。
嗯...你的數據類型是浮動的,所以它是預期的。如果你想要一個確切的結果,然後使用確切的數據類型 – Lamak
@Lamak - 做一個轉換爲十進制給我同樣的結果。 – Joey
如果您轉換每個數字,則不是:CONVERT(DECIMAL(16,4),0)+ .....' – Lamak