当前位置: 代码迷 >> Sql Server >> -=========SQL 四舍五入 的有关问题=========
  详细解决方案

-=========SQL 四舍五入 的有关问题=========

热度:588   发布时间:2016-04-24 10:38:25.0
---------=========SQL 四舍五入 的问题=========
表中两个字段 FrozenNum,Num 都float类型,,。
现在需要将新插入的和修改的数据保留三位小数,。不能在程序里面判断,所以写了如下的触发器
,但是这个触发器四舍五入的结果有时会不对。
例如,我把字段的值修改成 399.8785 ,最后会变成 399.878。 我想要的结果是 399.879
测试了很多遍都是这样,貌似只有小数点的第三位是奇数才会对。

--但为什么这两个的结果又是 399.879?,求大神讲解下
select Convert(decimal(18,3),399.8785)


select Convert(float,round(399.8785,3)) 


ALTER trigger [tri_StrongTbFNum]
on [dbo].[StrongTb] for update,insert
 as 
    declare @UpFrozen  float,@UpNum float,@id  int
begin 
  select @UpFrozen= Convert(float, round(FrozenNum,3)),
         @UpNum= Convert(float,round(Num,3)) ,
         @id=id from inserted
 
    update StrongTb set FrozenNum=@UpFrozen,Num=@UpNum where id=@id
end 

------解决方案--------------------
要精确就不要用float类型,改用numeric肯定没问题。
------解决方案--------------------
float为非精确类型,不保证数据的准确性。decimal、numeric可用,你可以看70-461这本书,里面有
------解决方案--------------------

--SQL Server 2000,查询分析器下测试
select Convert(float, 399.8705) union
select Convert(float, 399.8715) union
select Convert(float, 399.8725) union
select Convert(float, 399.8735) union
select Convert(float, 399.8745) union
select Convert(float, 399.8755) union
select Convert(float, 399.8765) union
select Convert(float, 399.8775) union
select Convert(float, 399.8785) union
select Convert(float, 399.8795)
/*
------返回结果---------
399.87049999999999
399.87150000000003
399.8725
399.87349999999998
399.87450000000001
399.87549999999999
399.87650000000002
399.8775
399.87849999999997
399.87950000000001
*/
  相关解决方案