现在的位置: 首页 > 综合 > 正文

sql server float 使用相关问题 (zz)

2013年01月12日 ⁄ 综合 ⁄ 共 6759字 ⁄ 字号 评论关闭

sql server float 使用相关问题

//z 2012-4-23 12:15:32 PM IS2120@CSDN
在 WHERE 子句搜索条件中(特别是 = 和 <> 运算符),应避免使用 float 或 real 列。最好限制使用 float 和 real 列做 > 或 < 的比较。
Floats have issues with representing certain numbers.
There are some numbers (for example, 0.3) that they cannot represent other than inexactly. Also, conversions between different numeric types and floating point types are imprecise.

If you are doing comparisons against floats, you should do them as range comparisons. So if you are comparing two float values, A and B, you should use an inexact comparison such as:

A between B - 0.01 and B + 0.01
or
abs(A-B) < 0.01

Unless you are storing engineering or mathematical data, I recommend you avoid floating point values within a database.

使用SqlServer中的float类型时发现的问题
在做项目中,使用了float类型来定义一些列,如:Price,但是发现了很多问题
1、当值的位数大于6位是float型再转varchar型的时候会变为科学技术法显示
    此时只好将float型转换成numeric型,再转换成varchar
2、float型变量在存入值时,有时值得大小会发生改变。这个现象发生在对报价保存时,如:保存一个3.8,但到了数据库中变成了3.80001124或3.79998999等
在SqlServer的帮助中是这样描述float类型的:用于表示浮点数字数据的近似数字数据类型。浮点数据为近似值;并非数据类型范围内的所有数据都能精确地表示。
所以今后这个类型一定要慎用

 
评论
#1楼 218.69.6.* 2007-08-05 16:09 William Wang [未注册用户]
还是使用decimal(numeric)比较好
                          
//z 2012-4-23 12:15:32 PM IS2120@CSDN
请问float类型如何设置小数位数?

在客户端(C#),如果存入一个带小数位的小数,如:Insert   into   (fieldA)   values   (2.4);其中,fieldA是float类型.存入数据库后,数据有可能变成2.400000或者2.4000001或者2.399999999.晕.  
   
  请问如何设置.
=========================================================================
这没关系.显示时转换一下.  
   
  select   cast(fieldA   as   decimal(18,1))
=========================================================================
decimal
=========================================================================
用   decimal   類型   或   用   convert   轉換
=========================================================================
                          

SQL Server 2000中的float类型显示四位小数

SQL Server 2000中:

如果是数据类型Float 11.8,它就默认以11.800000000000001存储了,显示的时候看起来蛮不爽的,偶只想要4位小数,找了好多资料,把float型用smallmoney型感觉上就可以了。

浮点数据类型用于存储十进制小数。浮点数值的数据在SQL Server 中采用上舍入(Round up 或称为只入不舍)方式进行存储。所谓上舍入是指,当(且仅当)要舍入的数是一个非零数时,对其保留数字部分的最低有效位上的数值加1 ,并进行必要的进位。若一个数是上舍入数,其绝对值不会减少。如:对3.14159265358979 分别进行2 位和12位舍入,结果为3.15 和3.141592653590。

货币数据表示正的或负的货币值。在 Microsoft SQL Server 2000 中使用 money 和 smallmoney 数据类型存储货币数据。货币数据存储的精确度为四位小数。(正好达到我的要求:显示四为小数就OK了)

Monetary data represents positive or negative amounts of money. In Microsoft® SQL Server™ 2000, monetary data is stored using the money and smallmoney data types. Monetary data can be stored to an accuracy of four decimal places. Use the smallmoney data type
to store values in the range from -214,748.3648 through 214,748.3647 (requires 4 bytes to store a value).

SQL Server 中Float类型 如何转换成 Varchar类型 ?

方法 如下 :

float转化成varchar类型

select convert(varchar(8000),cast(convert(float,'12345678900') as decimal))

select str(convert(float,'123456789000'),len(convert(float,'123456789000')))

select convert(varchar(8000),cast(convert(float,'12345678900') as decimal))

STR ( float_expression [ , length [ ,    ] ] )

备注
如果为 STR 提供 length 和 decimal 参数值,则这些值应该是正数。在默认情况下或小数参数为 0 时,数字舍入为整数。指定的长度应大于或等于小数点前面的部分加上数字符号(如果有)的长度。短的 float_expression 在指定长度内右对齐,长的 float_expression 则截断为指定的小数位数。例如,STR(12,10) 输出的结果是 12。它在结果集内右对齐。而 STR(1223,2) 则将结果集截断为 **。可以嵌套字符串函数。

注意:
若要转换为 Unicode 数据,请在 CONVERT 或 CAST 转换函数内使用 STR。

参数
float_expression
带小数点的近似数字 (float) 数据类型的表达式。

length
总长度。它包括小数点、符号、数字以及空格。默认值为 10。

decimal
小数点后的位数。decimal 必须小于或等于 16。如果 decimal 大于 16,则会截断结果,使其保持为小数点后具有十六位。

返回类型
char

SQL Server 2000 小数类型-使用 decimal、float 和 real 数据

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™ 使用上舍入。所有的数值必须精确到确定的精度,但会产生细小的浮点值变化。因为浮点数字的二进制表示法可以采用很多合法舍入规则中的任意一条,因此我们不可能可靠地量化一个浮点值。
//z 2012-4-23 12:15:32 PM IS2120@CSDN

用于表示浮点数字数据的近似数字数据类型。浮点数据为近似值;并非数据类型范围内的所有数据都能精确地表示。 语法 float [ ( n ) ] 从 - 1.79E + 308 到 1.79E + 308 之间的浮点数字数据。n 为用于存储科学记数法 float 数尾数的位数,同时指示其精度和存储

用于表示浮点数字数据的近似数字数据类型。浮点数据为近似值;并非数据类型范围内的所有数据都能精确地表示。

语法

float [ ( n ) ]

从 - 1.79E + 308 到 1.79E + 308 之间的浮点数字数据。n 为用于存储科学记数法 float 数尾数的位数,同时指示其精度和存储大小。n 必须为从 1 到 53 之间的值。

n 所在范围精度存储大小1-247 位数4 字节25-5315 位数8 字节

Microsoft® SQL Server™ float[(n)] 数据类型对于从 1 到 53 之间的所有 n 值均符合 SQL-92 标准。double precision 的同义词为 float(53)。

real

从 ?3.40E + 38 到 3.40E + 38 之间的浮点数字数据。存储大小为 4 字节。在 SQL Server 中,real 的同义词为 float(24)。

执行GetFloat方法时总是提示转换错误,后来查看帮助手册发现:

数据库的字段:
类型:float 代表从 - 1.79E + 308 到 1.79E + 308 之间的浮点数字数据。(占用8字节)
类型:real 代表从 -3.40E + 38 到 3.40E + 38 之间的浮点数字数据。(占用4字节)而C#中:
double 表示一个值介于 -1.79769313486232e308 和 +1.79769313486232e308 之间的双精度 64 位数字(8字节)float 表示一个值介于 -3.402823e38 和 +3.402823e38 之间的单精度 32 位数字(4字节)

就是说数据库中没有double型,float就表示double值。
sql server数据库字段类型与.net的数据类型的对应关系:

real(数据库)<--> float(.NET)
float(数据库)<--> double(.NET)

读取数据库中的float类型的字段要使用GetDouble方法
读取数据库中的real类型的字段时才应该使用GetFloat方法

下面总结一下T-SQL特有的一些语法点

GO 批发送,几条T-SQL语句之后加上GO,这几条sql作为一个批次发送到执行引擎。SQL局部变量的作用域就是一个批发送。

局部变量       变量名必须以@开头,作用范围是一个批发送。

全局变量       变量名必须以@@开头,作用范围是整个应用程序。

@@IDENTITY在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的最后一个标识值

定义局部变量       DECLARE      @local_variable     (AS)              type

设置局部变量       SET        @local_variable=

                            SELECT  @local_variable=    接收一个标量值或者是SELECT返回集合中的最后一个元素

标识符分割符 “ ”[ ]

通配符    _     匹配一个字符      
%
    匹配多个字符

字符串 “charactor”      Unicode字符串    
N”charactor”

数据类型       int    对应常见编程语言中的Int32数据类型

float(n) 所在范围 精度 存储大小
 1-24 7 位数 4 字节 32位浮点数      对应编程语言中的float(Single)
 25-53 15 位数 8 字节 64位浮点数  对应编程语言中的double
 real=float(24) 4字节     对应编程语言中的float(Single)

charvarcharncharnvarchar

char nchar 固定长度字符串

varchar nvarchar 可变长度字符串

char varchar   普通字符

nchar nvarchar Unicode字符

一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar

逻辑运算符 IN  ALL  ANY 比较元素和集合,比较在集合中与否用IN,比较是否对集合中每个元素都成立用ALL,比较是否在集合中有元素成立用ANY。

系统函数GETDATE()返回当前数据库系统时间戳,返回值的类型为datetime

下面总结一下T-SQL特有的一些语法点

GO 批发送,几条T-SQL语句之后加上GO,这几条sql作为一个批次发送到执行引擎。SQL局部变量的作用域就是一个批发送。

局部变量       变量名必须以@开头,作用范围是一个批发送。

全局变量       变量名必须以@@开头,作用范围是整个应用程序。

@@IDENTITY在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的最后一个标识值

定义局部变量       DECLARE      @local_variable     (AS)              type

设置局部变量       SET        @local_variable=

                            SELECT  @local_variable=    接收一个标量值或者是SELECT返回集合中的最后一个元素

标识符分割符 “ ”[ ]

通配符    _     匹配一个字符      
%
    匹配多个字符

字符串 “charactor”      Unicode字符串    
N”charactor”

数据类型       int    对应常见编程语言中的Int32数据类型

float(n) 所在范围 精度 存储大小
 1-24 7 位数 4 字节 32位浮点数      对应编程语言中的float(Single)
 25-53 15 位数 8 字节 64位浮点数  对应编程语言中的double
 real=float(24) 4字节     对应编程语言中的float(Single)

charvarcharncharnvarchar

char nchar 固定长度字符串

varchar nvarchar 可变长度字符串

char varchar   普通字符

nchar nvarchar Unicode字符

一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar

逻辑运算符 IN  ALL  ANY 比较元素和集合,比较在集合中与否用IN,比较是否对集合中每个元素都成立用ALL,比较是否在集合中有元素成立用ANY。

系统函数GETDATE()返回当前数据库系统时间戳,返回值的类型为datetime

抱歉!评论已关闭.