MSDN description of decimal所示,某些精度范围具有分配给它们的相同数量的存储字节。

sql-server - 为什么小数位数的精度范围宽度有所不同?-LMLPHP

我不明白的是,范围的大小存在差异。从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的整数倍,具体取决于声明的小数位数)

整数的长度为481216个字节,具体取决于声明的精度。某些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);


显示存储为的第一行

sql-server - 为什么小数位数的精度范围宽度有所不同?-LMLPHP

和第二个

sql-server - 为什么小数位数的精度范围宽度有所不同?-LMLPHP

注意,符号位之后的值是字节反转的。 0x3B9AC9FF = 999999999

关于sql-server - 为什么小数位数的精度范围宽度有所不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55198082/

10-11 01:37
查看更多