Sql精度问题

jiajiaren 2014-06-13 09:00:20


@a,@b为已知的两个FLOAT类型的数,@c 为@a,@b中精度更大的数,@aunit为a的单位,@bunit为b的单位
DECLARE @a FLOAT,@b FLOAT,@c FLOAT,@aunit VARCHAR(2),@bunit VARCHAR(2)
SET @a=149003.44
SET @aunit='元'
SET @b=149003.4387
SET @bunit='元'


问题1:@a,@b 单位相等(按精度小的转换四舍五入判断两个值是否相等,所以@b转换后也为149003.44),但@b的精度高
,单位相等按原值输出:@c=149003.4387





DECLARE @a FLOAT,@b FLOAT,@c FLOAT,@aunit VARCHAR(2),@bunit VARCHAR(2)
SET @a=39065753.213
SET @aunit='万元'
SET @b=3906.575321
SET @bunit='亿元'

(假设已知亿元=10000*万元)
问题2:@a,@b 单位不相等,(按大单位先转换,然后按精度小的转换四舍五入判断两个值是否相等),但@a转换后的精度更高,所以@c为@a转换后的值
单位不相等按转换后的值输出:@c=3906.5753213


...全文
401 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2014-06-13
  • 打赏
  • 举报
回复
--按斑竹这个方式
DECLARE @a FLOAT,@b FLOAT,@c FLOAT,@aunit VARCHAR(2),@bunit VARCHAR(2)
SET @a=149003.44
SET @aunit='元'
SET @b=149003.4387
SET @bunit='元'
SELECT (CASE WHEN FLOOR(@b)<FLOOR(@a) THEN @a ELSE @b END )
--第一个正确

SET @a=149003.44
SET @aunit='元'
SET @b=149003.4401
SET @bunit='元'
SELECT (CASE WHEN FLOOR(@b)<FLOOR(@a) THEN @a ELSE @b END )

--这个错误 , 正确为149003.4401,因为@b 小数更多



/*
----------------------
149003.4387

(1 row(s) affected)


----------------------
149003.4401
*/
jiajiaren 2014-06-13
  • 打赏
  • 举报
回复
引用 19 楼 DBA_Huangzj 的回复:
--按斑竹这个方式
DECLARE @a FLOAT,@b FLOAT,@c FLOAT,@aunit VARCHAR(2),@bunit VARCHAR(2)
SET @a=149003.44
SET @aunit='元'
SET @b=149003.4387
SET @bunit='元'
SELECT (CASE WHEN @b<@a THEN @b ELSE @a END )
--第一个正确

SET @a=149003.44
SET @aunit='元'
SET @b=149003.4401
SET @bunit='元'
SELECT (CASE WHEN @b<@a THEN @a ELSE @b END )

--这个错误 , 正确为149003.4401,因为@b 小数更多



/*
----------------------
149003.4387

(1 row(s) affected)


----------------------
149003.4401

*/
你这个语句都不一样,难道每个单独写一个?
發糞塗牆 2014-06-13
  • 打赏
  • 举报
回复
--按斑竹这个方式
DECLARE @a FLOAT,@b FLOAT,@c FLOAT,@aunit VARCHAR(2),@bunit VARCHAR(2)
SET @a=149003.44
SET @aunit='元'
SET @b=149003.4387
SET @bunit='元'
SELECT (CASE WHEN @b<@a THEN @b ELSE @a END )
--第一个正确

SET @a=149003.44
SET @aunit='元'
SET @b=149003.4401
SET @bunit='元'
SELECT (CASE WHEN @b<@a THEN @a ELSE @b END )

--这个错误 , 正确为149003.4401,因为@b 小数更多



/*
----------------------
149003.4387

(1 row(s) affected)


----------------------
149003.4401

*/
jiajiaren 2014-06-13
  • 打赏
  • 举报
回复
引用 17 楼 DBA_Huangzj 的回复:
SET @a=149003.44 SET @aunit='元' SET @b=149003.4401 SET @bunit='元' SELECT (CASE WHEN @b<@a THEN @b ELSE @a END )---CASE WHEN @b<@a THEN @a ELSE @b END 你逻辑错了
现在要得到149003.4401 怎么写?
發糞塗牆 2014-06-13
  • 打赏
  • 举报
回复
SET @a=149003.44 SET @aunit='元' SET @b=149003.4401 SET @bunit='元' SELECT (CASE WHEN @b<@a THEN @b ELSE @a END )---CASE WHEN @b<@a THEN @a ELSE @b END 你逻辑错了
jiajiaren 2014-06-13
  • 打赏
  • 举报
回复
引用 15 楼 DBA_Huangzj 的回复:
这样?
DECLARE @a FLOAT,@b FLOAT,@c FLOAT,@aunit VARCHAR(2),@bunit VARCHAR(2)
SET @a=39065753.213
SET @aunit='万元'
SET @b=3906.575321
SET @bunit='亿元'

set @b=@b*10000
SELECT (CASE WHEN @b>@a THEN @b ELSE @a END )/10000


/*

----------------------
3906.5753213
*/
--按斑竹这个方式
DECLARE @a FLOAT,@b FLOAT,@c FLOAT,@aunit VARCHAR(2),@bunit VARCHAR(2)
SET @a=149003.44
SET @aunit='元'
SET @b=149003.4387
SET @bunit='元'
SELECT (CASE WHEN @b<@a THEN @b ELSE @a END )
--第一个正确

SET @a=149003.44
SET @aunit='元'
SET @b=149003.4401
SET @bunit='元'
SELECT (CASE WHEN @b<@a THEN @b ELSE @a END )

--这个错误 , 正确为149003.4401,因为@b 小数更多



發糞塗牆 2014-06-13
  • 打赏
  • 举报
回复
这样?
DECLARE @a FLOAT,@b FLOAT,@c FLOAT,@aunit VARCHAR(2),@bunit VARCHAR(2)
SET @a=39065753.213
SET @aunit='万元'
SET @b=3906.575321
SET @bunit='亿元'

set @b=@b*10000
SELECT (CASE WHEN @b>@a THEN @b ELSE @a END )/10000


/*

----------------------
3906.5753213
*/
jiajiaren 2014-06-13
  • 打赏
  • 举报
回复
引用 13 楼 DBA_Huangzj 的回复:
那就比较痛苦了,可能需要先根据单位,不如用case when来枚举,然后转换成相同的单位,在判断,而且float类型不适合判断
就上面的@c 斑竹有没有办法得到?
發糞塗牆 2014-06-13
  • 打赏
  • 举报
回复
那就比较痛苦了,可能需要先根据单位,不如用case when来枚举,然后转换成相同的单位,在判断,而且float类型不适合判断
jiajiaren 2014-06-13
  • 打赏
  • 举报
回复
引用 9 楼 DBA_Huangzj 的回复:
首先我建议你使用numeric/decimal这种类型,可以指定小数位,然后如果要做位数的对比,可能需要转换成字符串来判断
关键也不能指定小数位,因为有单位转换,一个小数差别大的很,比如如果单位为:亿元与元的转换关系
jiajiaren 2014-06-13
  • 打赏
  • 举报
回复
引用 10 楼 DBA_Huangzj 的回复:
关系型数据库不适合做复杂的逻辑运算,有些信息可能需要额外的列甚至表来预存,比如亿元等于多少元这些
关键现在数据库中的数据列类型为float,单位有别的列存储,需要判断后导入的数据比存在库里的数据哪个小数点位数更多,四舍五入后,数据如果相等,哪个位数多用哪个
發糞塗牆 2014-06-13
  • 打赏
  • 举报
回复
关系型数据库不适合做复杂的逻辑运算,有些信息可能需要额外的列甚至表来预存,比如亿元等于多少元这些
發糞塗牆 2014-06-13
  • 打赏
  • 举报
回复
首先我建议你使用numeric/decimal这种类型,可以指定小数位,然后如果要做位数的对比,可能需要转换成字符串来判断
jiajiaren 2014-06-13
  • 打赏
  • 举报
回复
引用 7 楼 DBA_Huangzj 的回复:
float是非精确类型,不能保证返回的数据准确性
将数据按单位转换后,有没有办法按小数点的位数进行比较?
發糞塗牆 2014-06-13
  • 打赏
  • 举报
回复
float是非精确类型,不能保证返回的数据准确性
jiajiaren 2014-06-13
  • 打赏
  • 举报
回复
引用 5 楼 fredrickhu 的回复:
FLOAT本来就是浮点数 你还要求精度?
按小数位置判断不可以吗?
--小F-- 2014-06-13
  • 打赏
  • 举报
回复
FLOAT本来就是浮点数 你还要求精度?
jiajiaren 2014-06-13
  • 打赏
  • 举报
回复
引用 2 楼 duanzi_peng 的回复:
decimal(18,2) 或者 decimal(9,2)
精度位数不是确定的
jiajiaren 2014-06-13
  • 打赏
  • 举报
回复
引用 1 楼 u012173239 的回复:
你给她换个类型就可以了,float并没有长度的限制,你可以用numeric(@a,@b)
长度本来就没有限制
  • 打赏
  • 举报
回复
decimal(18,2) 或者 decimal(9,2)
加载更多回复(3)

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧