如MSDN description of decimal所示,某些精度范围具有分配给它们的相同数量的存储字节。
我不明白的是,范围的大小存在差异。从5个存储字节的1到9的范围的宽度为9,而从9个存储字节的10到19的范围如何为10的宽度。那么下一个13个存储字节的范围又为9的宽度,而下一个的宽度再次为10。
由于存储字节每次增加4,因此我希望所有范围都具有相同的宽度。或者,第一个较小的可以为标牌或其他东西保留空间,但此后宽度相等。但是它又从9变为10,再到9变为10。
这里发生了什么?如果存在的话,21个存储字节的精度范围是否为39-47,即模式9-10-9-10-9-10 ...?
最佳答案
21个存储字节的精度范围为39-47
编号2 ^ 160 = 1,461,501,637,330,902,918,203,684,832,716,283,019,655,932,542,976
-有49个十进制数字。因此,此假设情况将满足39-48
的精度范围(因为20字节的整数将不足以容纳任何大于该数字的49位数字)
第一个字节保留用于符号。01
用于正数; 00
表示否定。
余数将值存储为整数。即1.234
将存储为整数1234
(或10的整数倍,具体取决于声明的小数位数)
整数的长度为4
,8
,12
或16
个字节,具体取决于声明的精度。某些10
数字整数可以存储在4
字节中,但是要获得整个范围,将导致溢出,因此需要进行下一步。
等等。2^32 = 4,294,967,295
(10位数字)2^64 = 18,446,744,073,709,551,616
(20位数字)2^96 = 79,228,162,514,264,337,593,543,950,336
(29位数字)2^128 = 340,282,366,920,938,463,463,374,607,431,768,211,456
(39位数字)
您需要使用DBCC PAGE
进行查看,将列强制转换为binary
并不能为您提供存储形式。或使用SQL Server内部查看器之类的实用程序。
CREATE TABLE T(
A DECIMAL( 9,0),
B DECIMAL(19,0),
C DECIMAL(28,0) ,
D DECIMAL(38,0)
);
INSERT INTO T VALUES
(999999999, 9999999999999999999, 9999999999999999999999999999, 99999999999999999999999999999999999999),
(-999999999, -9999999999999999999, -9999999999999999999999999999, -99999999999999999999999999999999999999);
显示存储为的第一行
和第二个
注意,符号位之后的值是字节反转的。
0x3B9AC9FF
= 999999999
关于sql-server - 为什么小数位数的精度范围宽度有所不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55198082/