declare @f float 
declare @g float 
set @f=760 
set @g=2.3 
select cast(ceiling(@f*@g )  as int)
/*
            
----------- 
1748*/

解决方案 »

  1.   


    declare @f float 
    declare @g float 
    set @f=760 
    set @g=2.3 
    select ceiling(@f*@g) 
      

  2.   

    CEILING
    返回大于或等于所给数字表达式的最小整数。语法
    CEILING ( numeric_expression ) 参数
    numeric_expression是精确数字或近似数字数据类型类别的表达式(bit 数据类型除外)。返回类型
    返回与 numeric_expression 相同的类型。示例
    下面的示例显示使用 CEILING 函数的正数、负数和零值。 SELECT CEILING($123.45), CEILING($-123.45), CEILING($0.0)
    GO下面是结果集:--------- --------- ------------------------- 
    124.00    -123.00    0.00                     (1 row(s) affected)
      

  3.   

    declare @f float 
    declare @g float 
    set @f=760 
    set @g=2.3 
    select ceiling(@f*@g) 
    ----------------------
    1748(1 行受影响)
      

  4.   

    declare @f float 
    declare @g float 
    set @f=760 
    set @g=2.3 
    select ceiling(@f*@g) 
      

  5.   

    楼主在sql联机帮助上看一下FLOOR与Ceiling函数之间的区别吧。这样你会理解透彻些。
      

  6.   

    declare @f float 
    declare @g float 
    set @f=760 
    set @g=2.3 
    select round(@f*@g,0)
      

  7.   

    select @f*@g这样不就行了嘛....
      

  8.   

    比较 CEILING 和 FLOOR
    CEILING 函数返回大于或等于所给数字表达式的最小整数。FLOOR 函数返回小于或等于所给数字表达式的最大整数。例如,对于数字表达式 12.9273,CEILING 将返回 13,FLOOR 将返回 12。FLOOR 和 CEILING 返回值的数据类型都与输入的数字表达式的数据类型相同。
      

  9.   

    哎,可能是我表达不清楚,没有一个回答到我的问题了由于程序需要,要在存储过程里,取整后,再进行合计。我这里所说的取整是指向下取整,也就是C语言里的int(value)
    即:2.0001 --> 2
        1.999 --> 1
        2.9999 ---> 2
        2.0 ---> 2但本来:760*2.3=1748(正常来说他是个整数)而结果变成了 1747
    所以这个问题,不是楼上各位回答的:round 的四舍五入,或者 ceiling的向上取整其实这里的
    select FLOOR(@f*@g) 
    也可以改成round
    各位可以去研究一下,结果是一样的
      

  10.   


    declare @f float 
    declare @g float 
    set @f=760 
    set @g=2.3 
    select ceiling(@f*@g)
      

  11.   

    谢谢各位了。现在用这种办法,可以做到了,不过不知道会不会有误差
    declare @f float 
    declare @g float 
    set @f=760 
    set @g=2.3 
    select round(convert(decimal(38,12),@f*@g),0,1)
    因为现在的 select round(convert(decimal(38,12),@f*@g),0,1)
    如果改成  select round(convert(decimal(38,13),@f*@g),0,1)
    还是会和刚刚的一样,应该是他一共存了13的小位数,如果只取12的话,有点四舍五入的嫌疑。这里面的理论我就不懂了,欢迎大家继续讨论。
      

  12.   

    float本来就有精度问题。内部计算和表示时,数据是近似值,所以计算结果也是个近似值
      

  13.   

    把float
    改成
    real就行了
      

  14.   

    嗯,还是decimal好用。
    declare @f decimal(18,3) 
    declare @g decimal(18,3) 
    set @f=760 
    set @g=2.3 
    select floor(@f*@g)
    /*
    1748
    */
      

  15.   


    都是float惹的祸啊,看看--1) float
    declare @f float 
    declare @g float 
    set @f=760.0 
    set @g=2.3 
    select round(convert(decimal(38,13),@f*@g),0,1) 
    go/*
    ---------------------------------------
    1747.0000000000000(1 row(s) affected)*/
    --2) decimal
    declare @f decimal(28,13) 
    declare @g decimal(28,17) 
    set @f=760.0 
    set @g=2.3 
    select round(convert(decimal(38,13),@f*@g),0,1) 
    go
    /*---------------------------------------
    1748.0000000000000(1 row(s) affected)
    */
    ---3) real
    declare @f real
    declare @g real
    set @f=760.0 
    set @g=2.3 
    select round(convert(decimal(38,13),@f*@g),0,1) 
    go
    /*
    ---------------------------------------
    1748.0000000000000(1 row(s) affected)
    */
    --4) 对比
    select round(convert(decimal(38,18),760*2.3),0,1) 
    go
    /*
    ---------------------------------------
    1748.000000000000000000(1 row(s) affected)
    */
      

  16.   


    decimal 数据类型最多可存储 38 个数字,所有数字都能够放到小数点的右边。decimal 数据类型存储了一个确定的数字表达法;没有存储值的近似值。定义 decimal 的列、变量和参数的两种特性如下:p
    指定精度或对象能够控制的数字个数。s
    指定可放到小数点右边的小数位数或数字个数。p 和 s 必须遵守以下规则:0 <= s <= p <= 38。numeric 和 decimal 数据类型的默认最大精度值是 38。在 Transact-SQL 中,numeric 与 decimal 数据类型在功能上等效。当数据值一定要按照指定精确存储时,可以用带有小数的 decimal 数据类型来存储数字。有关数学运算如何影响结果的精度和小数位数的信息,请参见精度、小数位数和长度。使用 float 和 real 数据float 和 real 数据类型被称为近似的数据类型。在近似数字数据类型方面,float 和 real 数据的使用遵循 IEEE 754 标准。近似数字数据类型并不存储为多数数字指定的精确值,它们只储存这些值的最近似值。在很多应用程序中,指定值与存储值之间的微小差异并不明显。
    但有时这些差异也值得引起注意。由于 float 和 real 数据类型的这种近似性,当要求精确的数字状态时,比如在财务应用程序中,在那些需要舍入的操作中,
    或在等值核对的操作中,就不使用这些数据类型。这时就要用 integer、decimal、money 或 smallmone 数据类型。在 WHERE 子句搜索条件中(特别是 = 和 <> 运算符),应避免使用 float 或 real 列。最好限制使用 float 和 real 列做 > 或 < 的比较。IEEE 754 规格提供了四种舍入模式:舍入到最接近的值、上舍入、下舍入和舍入到零。Microsoft® SQL Server™ 使用上舍入。所有的数值必须精确到确定的精度,
    但会产生细小的浮点值变化。因为浮点数字的二进制表示法可以采用很多合法舍入规则中的任意一条,因此我们不可能可靠地量化一个浮点值。