簡體   English   中英

MsSQL地板天花板問題? 還是對此有解釋?

[英]MsSQL FLOOR CEILING issue? Or is there an explanation about that?

任何人都可以在MsSQL中嘗試此操作:

select floor(4.7000000000000000000000000000000000000)+0.5

我得到以下結果:5(!!)但是應該是4.5!?

或重試:

select floor(4.70 * 0.25000 * 0.2440 * 5.6325 * 3.0542 * 2.345 * 2.35 * 3.253 )+0.5

結果是89! 但應該是:88.5?!

這是問題嗎? 還是對此有解釋? CEILING的相同問題)

謝謝你們!

根據FLOOR的文檔:

-- Syntax for SQL Server, Azure SQL Data Warehouse, Parallel Data Warehouse

FLOOR ( numeric_expression )

返回類型

返回與numeric_expression相同的類型。

問題在於這不是事實。 它保留基本類型,但是如果是decimal類型,則decimal減小為0:

SELECT
    SQL_VARIANT_PROPERTY(4.00, 'precision') AS [precision]
    SQL_VARIANT_PROPERTY(4.00, 'scale') AS scale,

結果:精度為3,比例為2。

SELECT 
    SQL_VARIANT_PROPERTY(FLOOR(4.00), 'precision') AS [precision],
    SQL_VARIANT_PROPERTY(FLOOR(4.00), 'scale') AS scale

結果:精度3, decimal為0。 decimal達到最大精度后,這便成為問題:

SELECT
    SQL_VARIANT_PROPERTY(4.7000000000000000000000000000000000000, 'precision') AS [precision]
    SQL_VARIANT_PROPERTY(4.7000000000000000000000000000000000000, 'scale') AS scale,

精度38,標度37。但是FLOOR將其轉換為精度38,標度0,並且

SELECT CONVERT(DECIMAL(38, 0), 4) + 0.5

根據添加decimal s時精度和decimal的規則,得出5 :其結果應為decimal(40, 1) ,但由於超出了最大精度,因此縮小了小數位數以保留在decimal(40, 1)前的位數盡可能長的時間段,再給我們一個decimal(38, 0)5

相反,這沒有問題:

SELECT 4.0000000000000000000000000000000000000 + 0.5

其結果是DECIMAL(38, 37) 4.5000000000000000000000000000000000000 DECIMAL(38, 37) ,它可以精確地容納4.5000000000000000000000000000000000000

道德:請注意FLOOR (和CEILING )的這種消除比例的方面,並根據需要降低精度,以免因溢出而降低比例:

SELECT CONVERT(DECIMAL(3, 0),  FLOOR(4.70 * 0.25000 * 0.2440 * 5.6325 * 3.0542 * 2.345 * 2.35 * 3.253)) + 0.5

產率88.5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM