算术溢出错误将float转换为带有正指数但不是负指数的数据类型numeric

时间:2014-08-06 17:26:57

标签: sql sql-server-2008

我的数字列设置为(38,19),但我得到了奇怪的算术溢出错误。

工作原理:

1a) INSERT INTO sen.numeric_table VALUES('MaxUBInt', 1844674407370955161);
1b) INSERT INTO sen.numeric_table VALUES('SmallestFloatBy10', 1.175494351e-39);

做什么工作:

2a) INSERT INTO sen.numeric_table VALUES('MaxFloat', 3.402823466e+38);
2b) INSERT INTO sen.numeric_table VALUES('MaxFloatBy10', 3.402823466e+39);

我不明白:

1)该栏目应允许任何不超过38位数的输入,以及小数点后不超过19位的输入。假设这是真的,为什么(1b)在我明显超过38位数字时工作? (以及小数后超过19位的精度)

谢谢!

2 个答案:

答案 0 :(得分:0)

根据你在1)和2)中的测试,看起来你正试图使用​​数字(38,19)数据类型找到int和float的上界以及float的下界。 int范围将由比例因子(19)确定,并且为数值数据类型定义精度边界(见下文)。

根据MSDN,SQL Server的最大精度为-10 ^ 38 +1到10 ^ 38 -1。最低精度将根据NUMERIC_ROUNDABORT的值进行舍入。

如果这是一个科学应用程序,您可能需要阅读MSDN description of precision, length, and scale,特别是如果您使用存储在数字列中的值执行操作。

答案 1 :(得分:-1)

下溢不会导致SQL服务器出错;它只会围捕。关于它有一些很好的讨论。例如:

http://social.msdn.microsoft.com/Forums/en-US/2e0ca122-ecca-4ec6-a60b-e3d4b9f51d94/underflow-does-not-cause-an-error?forum=transactsql