Round SQL Server

时间:2016-01-12 19:45:15

标签: sql sql-server sql-server-2008

如何避免在SQL Server中进行舍入

DECLARE @NUMERO1 AS numeric(26,8) = 0
DECLARE @NUMERO2 AS numeric(26,8) = 0

SET @NUMERO1 = 1.92306964
SET @NUMERO2 = 105
SELECT 1.92306964 * @NUMERO2
SELECT @NUMERO1* @NUMERO2 

结果不一样。

由于

2 个答案:

答案 0 :(得分:0)

如果想要更好的精度,请使用FLOAT而不是NUMERIC / DECIMAL类型。请尝试以下方法:

DECLARE @NUMERO1 AS FLOAT = 1.92306964
DECLARE @NUMERO2 AS FLOAT = 105
SELECT 1.92306964 * @NUMERO2 -- 201.9223122
SELECT @NUMERO1 * @NUMERO2  -- 201.9223122

答案 1 :(得分:0)

当您对SSMS中的数字进行硬编码时,它会被视为浮点数,而不是数字数,其行为方式不同。要使两个select语句的输出匹配,您需要编写如下内容:

DECLARE @NUMERO1 AS numeric(26,8) = 0
DECLARE @NUMERO2 AS numeric(26,8) = 0

SET @NUMERO1 = 1.92306964
SET @NUMERO2 = 105
SELECT cast(1.92306964 as numeric(26,8)) * @NUMERO2
SELECT @NUMERO1* @NUMERO2

但是,我假设您想要更高的浮点精度,这样可以让您向后工作:

DECLARE @NUMERO1 AS float = 0
DECLARE @NUMERO2 AS float = 0

SET @NUMERO1 = 1.92306964
SET @NUMERO2 = 105
SELECT 1.92306964 * @NUMERO2
SELECT @NUMERO1 * @NUMERO2 
SELECT (1.92306964 * @NUMERO2) / 1.92306964 -- returns @NUMERO2 as expected
SELECT (@NUMERO1 * @NUMERO2) / @NUMERO1 -- returns @NUMERO2 as expected