float取整问题 declare @f float declare @g float set @f=760 set @g=2.3 select cast(ceiling(@f*@g ) as int)/* ----------- 1748*/ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 declare @f float declare @g float set @f=760 set @g=2.3 select ceiling(@f*@g) 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) declare @f float declare @g float set @f=760 set @g=2.3 select ceiling(@f*@g) ----------------------1748(1 行受影响) declare @f float declare @g float set @f=760 set @g=2.3 select ceiling(@f*@g) 楼主在sql联机帮助上看一下FLOOR与Ceiling函数之间的区别吧。这样你会理解透彻些。 declare @f float declare @g float set @f=760 set @g=2.3 select round(@f*@g,0) select @f*@g这样不就行了嘛.... 比较 CEILING 和 FLOORCEILING 函数返回大于或等于所给数字表达式的最小整数。FLOOR 函数返回小于或等于所给数字表达式的最大整数。例如,对于数字表达式 12.9273,CEILING 将返回 13,FLOOR 将返回 12。FLOOR 和 CEILING 返回值的数据类型都与输入的数字表达式的数据类型相同。 哎,可能是我表达不清楚,没有一个回答到我的问题了由于程序需要,要在存储过程里,取整后,再进行合计。我这里所说的取整是指向下取整,也就是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各位可以去研究一下,结果是一样的 declare @f float declare @g float set @f=760 set @g=2.3 select ceiling(@f*@g) 谢谢各位了。现在用这种办法,可以做到了,不过不知道会不会有误差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的话,有点四舍五入的嫌疑。这里面的理论我就不懂了,欢迎大家继续讨论。 float本来就有精度问题。内部计算和表示时,数据是近似值,所以计算结果也是个近似值 把float改成real就行了 嗯,还是decimal好用。declare @f decimal(18,3) declare @g decimal(18,3) set @f=760 set @g=2.3 select floor(@f*@g)/*1748*/ 都是float惹的祸啊,看看--1) floatdeclare @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) decimaldeclare @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) realdeclare @f realdeclare @g realset @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)*/ 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™ 使用上舍入。所有的数值必须精确到确定的精度,但会产生细小的浮点值变化。因为浮点数字的二进制表示法可以采用很多合法舍入规则中的任意一条,因此我们不可能可靠地量化一个浮点值。 怎么用t-sql将网络上sqlserver数据库备份到本机啊? 一个Sql分组取最大值问题 怎么实现这样的Sql语句? 关于统计查询结果的行和列的统计的问题[SQL2000] 请教这样的SQL怎么写 sql2008 date的问题 一个简单得默认值问题,请大家多多指教(在线关注,结帖) Raiserror 怎么用 ??? ADO远程连接sqlserver 如何动态的想数据表中插入记录 sql server 2000中使用触发器批量插入,删除记录 在我写存储过程的时候,用sql 语句怎样insert单引号'等特殊符号??
declare @f float
declare @g float
set @f=760
set @g=2.3
select ceiling(@f*@g)
返回大于或等于所给数字表达式的最小整数。语法
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)
declare @g float
set @f=760
set @g=2.3
select ceiling(@f*@g)
----------------------
1748(1 行受影响)
declare @g float
set @f=760
set @g=2.3
select ceiling(@f*@g)
declare @g float
set @f=760
set @g=2.3
select round(@f*@g,0)
CEILING 函数返回大于或等于所给数字表达式的最小整数。FLOOR 函数返回小于或等于所给数字表达式的最大整数。例如,对于数字表达式 12.9273,CEILING 将返回 13,FLOOR 将返回 12。FLOOR 和 CEILING 返回值的数据类型都与输入的数字表达式的数据类型相同。
即:2.0001 --> 2
1.999 --> 1
2.9999 ---> 2
2.0 ---> 2但本来:760*2.3=1748(正常来说他是个整数)而结果变成了 1747
所以这个问题,不是楼上各位回答的:round 的四舍五入,或者 ceiling的向上取整其实这里的
select FLOOR(@f*@g)
也可以改成round
各位可以去研究一下,结果是一样的
declare @f float
declare @g float
set @f=760
set @g=2.3
select ceiling(@f*@g)
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的话,有点四舍五入的嫌疑。这里面的理论我就不懂了,欢迎大家继续讨论。
改成
real就行了
declare @f decimal(18,3)
declare @g decimal(18,3)
set @f=760
set @g=2.3
select floor(@f*@g)
/*
1748
*/
都是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)
*/
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™ 使用上舍入。所有的数值必须精确到确定的精度,
但会产生细小的浮点值变化。因为浮点数字的二进制表示法可以采用很多合法舍入规则中的任意一条,因此我们不可能可靠地量化一个浮点值。