SQL 中的四舍五入不正确
Rounding off incorrectly in SQL
因此,当我将小数点后的第一个数字设为 4、5 或 8 时,我得到一个不正确的四舍五入值作为输出(如下面的 'CASE 1' 所示)。但是当我在同一个地方使用其他数字 (1,2,3,5,6,9,0) 时,我得到了预期的结果(如下面的 'CASE 2' 所示)。谁能解释为什么会这样?
--CASE 1
DECLARE @factor float = 0.425,
@amount money = 1
SELECT CONVERT(money, ROUND(@factor * @amount, 2))
--output is 0.42 (should be 0.43)
--CASE 2
SET @factor = 0.625
SELECT CONVERT(money, ROUND(@factor * @amount, 2))
--output is 0.63 (correct)
请注意,通过使用另一个变量来存储产品 - '@factor * @amount' 然后使用该变量来获取四舍五入值,这个问题得到了解决。但我只是好奇为什么我会看到之前的差异。
提前致谢。
好吧,价值观就在边缘。 0.425 和 0.625 会四舍五入,而例如 0.42499999999999 和 0.62499999999999 会四舍五入。
您正在使用 FLOAT
,这不是一种精确的数据类型,而是一种近似的数据类型。因此,您只能期待大概的结果。
如果您想要精确的结果,请使用精确的类型,例如 DECIMAL
。
文档:https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-types-transact-sql?view=sql-server-ver15
因此,当我将小数点后的第一个数字设为 4、5 或 8 时,我得到一个不正确的四舍五入值作为输出(如下面的 'CASE 1' 所示)。但是当我在同一个地方使用其他数字 (1,2,3,5,6,9,0) 时,我得到了预期的结果(如下面的 'CASE 2' 所示)。谁能解释为什么会这样?
--CASE 1
DECLARE @factor float = 0.425,
@amount money = 1
SELECT CONVERT(money, ROUND(@factor * @amount, 2))
--output is 0.42 (should be 0.43)
--CASE 2
SET @factor = 0.625
SELECT CONVERT(money, ROUND(@factor * @amount, 2))
--output is 0.63 (correct)
请注意,通过使用另一个变量来存储产品 - '@factor * @amount' 然后使用该变量来获取四舍五入值,这个问题得到了解决。但我只是好奇为什么我会看到之前的差异。 提前致谢。
好吧,价值观就在边缘。 0.425 和 0.625 会四舍五入,而例如 0.42499999999999 和 0.62499999999999 会四舍五入。
您正在使用 FLOAT
,这不是一种精确的数据类型,而是一种近似的数据类型。因此,您只能期待大概的结果。
如果您想要精确的结果,请使用精确的类型,例如 DECIMAL
。
文档:https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-types-transact-sql?view=sql-server-ver15