日期:2014-05-19  浏览次数:20410 次

一个decimal格式数据的问题(在线等)
写有如下存储过程
DECLARE
@OrderNum   nvarchar(50),
@Uname   nvarchar(50),
@Addr   nvarchar(500),
@Tel   nvarchar(50),
@Email   nvarchar(50),
@ProductID   int,
@Price   decimal(9),
@ProductSum   int,
@Heji   decimal(9),
@Asum   decimal(9),
@Jurisdiction   int/*权限会员或非会员*/
/*下面为赋值*/
SET   @OrderNum   =   '114 '
SET   @Uname   =   'lll '
set   @Addr= 'dfsaf '
set   @Tel= '111111 '
set   @Email= 'fdsad '
set     @ProductID=16
set   @Price= '7.6 '
set   @ProductSum=2
set   @Heji= '15.2 '
set   @Asum= '15.2 '
set   @Jurisdiction=3

declare   @iOrderID   int
declare   @sCount   int
/*向tblOrder(定单表中添加信息)*/
if   (Exists(select   ID   from   tblOrder   where   OrderNum=@OrderNum))
begin
        select   @iOrderID=ID   from   tblOrder   where   OrderNum=@OrderNum
end
else
begin
        insert   into   tblOrder(OrderNum,UserName,Addr,Tel,Email,Worth,Jurisdiction)values(@OrderNum,@Uname,@Addr,@Tel,@Email,@Asum,@Jurisdiction)
        set   @iOrderID=@@identity
        set   @sCount=(select   count(ID)   from   tblMember   where   Email=@Email   and   MemberType=@Jurisdiction)
        if(@sCount> 0)
              begin
                  update   tblMember   set   MemberName=@Uname,Address=@Addr,Phone=@Tel   where   Email=@Email   and   MemberType=@Jurisdiction
              end
        else
            begin
                insert   into   tblMember   (MemberType,MemberName,   TrueName,   Address,   Phone,   Email,   Password)   values   (@Jurisdiction,@Uname, ' ',@Addr,@Tel,@Email, ' ')
            end
end

/*向tblOrderDetail(定单明细表中添加信息)*/
insert   into   tblOrderDetail(OrderID,ProductID,Price,Number,Heji)values(@iOrderID,@ProductID,@Price,@ProductSum,@Heji)


运行后我到数据库中看,发现本来是15.2的值变成15,7.6却变成8
它进行了四舍五入

是怎么回事???


------解决方案--------------------
看看数据表的字段类型
------解决方案--------------------
数据类型不对. decimal(9,2)
------解决方案--------------------
你要指定小数的位,
一般可以定义为

declare @d decimal(18,3)

------------------
SqlServer的帮助中:

decimal 和 numeric
带定点精度和小数位数的 numeric 数据类型。

decimal[(p[, s])] 和 numeric[(p[, s])]

定点精度和小数位数。使用最大精度时,有效值从 - 10^38 +1 到 10^38 - 1。decimal 的 SQL-92 同义词是 dec 和 dec(p, s)。

p(精度)

指定小数点左边和右边可以存储的十进制数字的最大个数。精度必须是从 1 到最大精度之间的值。最大精度为 38。

s(小数位数)

指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 p 之间的值。默认小数位数是 0,因而 0 <= s <= p。最大存储大小基于精度而变化。

精度 存储字节数
1 - 9 5
10-19 9
20-28 13
29-38 17

------解决方案--------------------