@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
 

解决方案 »

  1.   

    你给她换个类型就可以了,float并没有长度的限制,你可以用numeric(@a,@b)
      

  2.   

    decimal(18,2) 或者 decimal(9,2)
      

  3.   

    FLOAT本来就是浮点数 你还要求精度?
      

  4.   

    float是非精确类型,不能保证返回的数据准确性
      

  5.   

    首先我建议你使用numeric/decimal这种类型,可以指定小数位,然后如果要做位数的对比,可能需要转换成字符串来判断
      

  6.   

    关键现在数据库中的数据列类型为float,单位有别的列存储,需要判断后导入的数据比存在库里的数据哪个小数点位数更多,四舍五入后,数据如果相等,哪个位数多用哪个
      

  7.   

    那就比较痛苦了,可能需要先根据单位,不如用case when来枚举,然后转换成相同的单位,在判断,而且float类型不适合判断
      

  8.   

    这样?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
    */
      

  9.   

    --按斑竹这个方式
    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 小数更多
      

  10.   

    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 
    你逻辑错了
      

  11.   

    --按斑竹这个方式
    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*/
      

  12.   

    --按斑竹这个方式
    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
    */
      

  13.   

    DECLARE @a FLOAT,@b FLOAT,@c FLOAT,@aunit VARCHAR(2),@bunit VARCHAR(2)
    SET @a=149003.44
    SET @aunit='元'
    SET @b=149003.4
    SET @bunit='元'
     
    SELECT (CASE WHEN FLOOR(@b)<FLOOR(@a) THEN @a ELSE @b END )--好像不对吧,取小数点多的,应该为 149003.44
      

  14.   

    四舍五入用这类的写法比较好:select cast(round(2.158,2) as numeric(5,2))
    但是它是定长的,而你这个不定长,要判断的话要写好多东西。。