![](/img/trans.png)
[英]Generate realistic sequence of numbers in SQL based on a random floor/ceiling
[英]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.