【发布时间】:2009-09-25 18:30:01
【问题描述】:
我发现了一些奇怪的行为,即存储过程返回一两美分的不准确结果。
代码如下(不是我写的):
ALTER PROCEDURE [dbo].[TN_GetSimpleBalance]
@custID int,
@nBalance decimal (8,2) output
AS
declare @ArBalance as decimal (8,2)
declare @custStatusCode varchar (2)
declare @unbilledCallsAmount as decimal (8,2)
set @nBalance = 0
set @ArBalance = 0
set @custstatusCode = ''
set @unbilledCallsAmount = 0
SET NOCOUNT ON
select @unbilledCallsAmount = isnull(sum(callcharge+taxamount),0)
from call with (NOLOCK) where custid = @custID and callstatuscode in ('R', 'B')
--get AR balance
select @ArBalance = isnull(sum(amount),0)
from artran with (NOLOCK)
where custid = @custID AND POSTEDFLAG ='Y'
set @nBalance = @unbilledCallsAmount + @ArBalance
@nBalance 显示为零,即使另一个应用程序告诉我客户有 0.02 美元。 callcharge 和 taxamount 都是货币数据类型。
这是我第一次遇到这种情况,但我正在将一些相关代码转移到生产环境中,并被“要求”对此进行研究。
你怎么看?金钱和十进制数据类型之间有什么奇怪的地方吗?您认为还有什么可以解释这一点的吗?
【问题讨论】:
-
我唯一不确定的是数量数据类型。您可以尝试将货币字段转换为十进制 8,2 并查看结果是否改变
-
所以 this 是 Michael Bolton 的办公空间代码...
-
约翰 - 我也是这么想的 =)
标签: sql-server decimal rounding currency