Sql server 将int转换为real有什么限制
当我写作时:Sql server 将int转换为real有什么限制,sql-server,tsql,casting,Sql Server,Tsql,Casting,当我写作时: 选择强制转换(强制转换(32652317为实数)为int) 结果是: 32652316 在类型为real的列中安全存储的最大整数是多少而不会有错误值的风险?只是为了好玩: 以下代码将返回第一个数字,其中您的演员阵容与原始数字不同 WITH x AS(SELECT 1 AS N FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS tbl(N))--10^1 ,N3 AS (SELECT 1 AS N FROM x C
选择强制转换(强制转换(32652317为实数)为int)
结果是:
32652316
在类型为real
的列中安全存储的最大整数是多少而不会有错误值的风险?只是为了好玩:
以下代码将返回第一个数字,其中您的演员阵容与原始数字不同
WITH x AS(SELECT 1 AS N FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS tbl(N))--10^1
,N3 AS (SELECT 1 AS N FROM x CROSS JOIN x AS N2 CROSS JOIN x N3) --10^3
,Tally AS(SELECT (ROW_NUMBER() OVER(ORDER BY(SELECT NULL))) AS Nr FROM N3
CROSS JOIN N3 N6 CROSS JOIN N3 AS N9)
SELECT TOP 1 Nr,CAST (CAST (Tally.Nr AS REAL) AS INT)
FROM Tally
WHERE Nr<>CAST (CAST (Tally.Nr AS REAL) AS INT);
我的结果是67108867和67108864
要求>5
我得到了134217734和134217728
更新:浮动与真实
如果将REAL
替换为FLOAT
,则不允许有任何中断强制转换的INT,但这需要8字节的存储空间
根据REAL
被视为FLOAT(24)
占用4个字节。32位中的24位用于尾数FLOAT
需要一个INT
-参数来设置其宽度<代码>浮动(24)远低于最大宽度。省略此参数默认为最大值53,但需要8个字节
即使使用FLOAT(1)
也至少为尾数保留1位。当第7个字节“开始”时,四舍五入开始。这发生在16777217以下的1个数字:
只是为了好玩:
以下代码将返回第一个数字,其中您的演员阵容与原始数字不同
WITH x AS(SELECT 1 AS N FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS tbl(N))--10^1
,N3 AS (SELECT 1 AS N FROM x CROSS JOIN x AS N2 CROSS JOIN x N3) --10^3
,Tally AS(SELECT (ROW_NUMBER() OVER(ORDER BY(SELECT NULL))) AS Nr FROM N3
CROSS JOIN N3 N6 CROSS JOIN N3 AS N9)
SELECT TOP 1 Nr,CAST (CAST (Tally.Nr AS REAL) AS INT)
FROM Tally
WHERE Nr<>CAST (CAST (Tally.Nr AS REAL) AS INT);
我的结果是67108867和67108864
要求>5
我得到了134217734和134217728
更新:浮动与真实
如果将REAL
替换为FLOAT
,则不允许有任何中断强制转换的INT,但这需要8字节的存储空间
根据REAL
被视为FLOAT(24)
占用4个字节。32位中的24位用于尾数FLOAT
需要一个INT
-参数来设置其宽度<代码>浮动(24)远低于最大宽度。省略此参数默认为最大值53,但需要8个字节
即使使用FLOAT(1)
也至少为尾数保留1位。当第7个字节“开始”时,四舍五入开始。这发生在16777217以下的1个数字:
使用
REAL
或FLOAT
时,总有不出错的风险,但有时会出现意外结果。。。您是否有充分的理由使用REAL
?@Shnugo-我们也需要担心整数部分吗?@Shungo我需要最小化存储空间&大多数值都很低,只有2位小数,但有些更大integers@VojtěchDohnal嗯,在大多数情况下,数字需要精确。用REAL
你永远不知道你会得到什么。。。顺便说一句:如果我的答案解决了你最初的问题,那就接受它吧。谢谢!使用REAL
或FLOAT
时,总有不出错的风险,但有时会出现意外的结果。。。您是否有充分的理由使用REAL
?@Shnugo-我们也需要担心整数部分吗?@Shungo我需要最小化存储空间&大多数值都很低,只有2位小数,但有些更大integers@VojtěchDohnal嗯,在大多数情况下,数字需要精确。用REAL
你永远不知道你会得到什么。。。顺便说一句:如果我的答案解决了你最初的问题,那就接受它吧。谢谢!伟大的永远不知道这一点,所以real只能安全地存储高达16777215(0xFFFFFF)的三字节整数,因为根据IEEE 754 single,指数需要8位?@VojtěchDohnal有多少行?你说:大多数值都是2位小数的低位,但有些是更大的整数。你期望的最大整数是多少,最小整数是多少?尝试使用十进制(10,2)
。这将保留在8字节的存储空间内,最多42949672字节。(用DATALENGTH
进行经验测试)@Shungo很快就会有数百万行。这就是为什么我想坚持使用4字节的实数。整数值是传送带上每120秒的重量,单位为kg,因此它不是cca max 100000的精确数字,所以应该可以。@VojtěchDohnal好吧,老实说:我不会为光盘存储而烦恼!特别是对于许多行,如果您只是为了节省以后的存储空间而尝试调皮,您将遇到更大的麻烦。在几乎所有情况下,使用适当的数据类型都是值得的。我坚持使用十进制(X,2)(X设置得足够大以满足您的需要)。太好了。。。永远不知道这一点,所以real只能安全地存储高达16777215(0xFFFFFF)的三字节整数,因为根据IEEE 754 single,指数需要8位?@VojtěchDohnal有多少行?你说:大多数值都是2位小数的低位,但有些是更大的整数。你期望的最大整数是多少,最小整数是多少?尝试使用十进制(10,2)
。这将保留在8字节的存储空间内,最多42949672字节。(用DATALENGTH
进行经验测试)@Shungo很快就会有数百万行。这就是为什么我想坚持使用4字节的实数。整数值是传送带上每120秒的重量,单位为kg,因此它不是cca max 100000的精确数字,所以应该可以。@VojtěchDohnal好吧,老实说:我不会为光盘存储而烦恼!特别是对于许多行,如果您只是为了节省以后的存储空间而尝试调皮,您将遇到更大的麻烦。在几乎所有情况下,使用适当的数据类型都是值得的。我坚持使用十进制(X,2)(X设置得足够大以满足您的需要)。