繁体   English   中英

将数字数据类型转换为数字的算术溢出错误

[英]Arithmetic overflow error converting numeric datatype to numeric

我在表中有以下各列

SIZE NUMERIC(14,5)    
PRICE NUMERIC(14,5)    

当我执行此select查询时,

SELECT SIZE,
PRICE,
SIZE*PRICE AS TOTAL 
FROM TNAME

我正在得到结果:

1.00000 90.00000    90.0000000000
1.00000 90.00000    90.0000000000
1.00000 90.00000    90.0000000000
1.00000 100.00000   100.0000000000
1.00000 30.00000    30.0000000000

我想知道为什么第三列以小数点后的10位返回?

我也得到

将数字数据类型转换为数字的算术溢出错误

在将结果插入另一个具有相同列和相同数据类型的表中时

INSERT INTO TNAME2(SIZE, PRICE, TOTAL)
   SELECT 
       SIZE, PRICE, SIZE * PRICE AS TOTAL 
   FROM 
       TNAME

尝试这个。

SELECT SIZE,
PRICE,
CAST(SIZE*PRICE AS numeric(14,5))AS TOTAL 
FROM TNAME
INSERT  INTO TNAME2
SELECT    SIZE ,
Price ,
CAST(SIZE * PRICE AS NUMERIC(15, 5))
FROM      TNAME

要么

INSERT  INTO TNAME2 (SIZE,Price,TOTAL)
SELECT    SIZE ,
Price ,
CAST(SIZE * PRICE AS NUMERIC(15, 5)) AS TOTAL
FROM      TNAME

关于第一个问题,小数位数,没有错。 这是我们在学校学习的基本的日常乘法:将两个十进制数字相乘会产生一个数字,该数字的十进制数字与操作数的十进制数字之和一样多。 整数位数最多可以等于操作数的整数位数之和。

10.11乘以12.13 122.6343 如果SQL Server违反了此基本规则并任意截断了结果,那将非常尴尬。

结果,当您尝试将产品存储在接受较少数字的列中时,会出现溢出错误。 SQL Server不会自动更改位数,因为没有办法确定正确的操作。

您有很多方法可以解决此问题,具体取决于您愿意承受的精度损失:

  • 截断多余的数字,即丢弃它们,接受最多单位损失。 如果您存储总计,这可能会变成很多钱。
  • 四舍五入到所需的位数。 听起来很直观,但是中间值(在您的情况下为0.00005)又如何呢? 是0.0001还是0.0000? 所以我们有
  • 四舍五入,其中0.5变为1,导致每次输入最多损失0.5
  • 向下,当它变​​为0时,损失相同
  • 四舍五入到偶数或奇数,即四舍五入到最接近的奇数或偶数,这平均会产生最小的损失。 虽然这听起来很奇怪,但它 IEEE 754中定义的标准。它也被称为banker's rounding因为它在簿记中用于最大程度地减少由于截断而造成的损失。

如果要存储较少的数字,则需要确定是否需要截断多余的数字或如何对数字进行四舍五入,然后自己编写代码。

在您的情况下,可以将CAST用作所需精度的数字。 这将执行四舍五入,其中0.00005变为0.0001,例如:

INSERT INTO TNAME2(SIZE, PRICE, TOTAL)
SELECT 
   SIZE, PRICE, CAST(SIZE * PRICE as numeric(14,5)) AS TOTAL 
FROM 
   TNAME

SQLFiddle 在这里

假设数字位数不超过14,这将起作用,否则,您将不得不更改表格字段的类型。

如果要在SQL中进行其他四舍五入,则必须创建自己的函数。

在下面找到有用的链接。 数字的乘法按照此链接,您可以尝试如下查询

SELECT SIZE,
PRICE,
CAST(SIZE*PRICE AS numeric(28,5))AS TOTAL 
FROM TNAME

尝试这个

SELECT SIZE,PRICE,CONVERT(numeric(14,5), SIZE*PRICE) AS TOTAL 
FROM TNAME

在插入中写相同的查询,它必须工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM