SQL Server中数字、浮点数和十进制的区别

numericfloatdecimal数据类型之间的区别是什么?哪些数据类型应该在哪些情况下使用?

对于任何类型的财务交易(例如工资领域),哪一个是首选的,为什么?

961708 次浏览

Decimal具有固定精度,而float具有可变精度。

EDIT(未能读取整个问题): Float(53)(又名real)是SQL Server中的双精度(64位)浮点数。Regular Float是一个单精度(32位)浮点数。对于很多计算来说,Double是精度和简单性的很好结合。您可以使用十进制创建一个非常高精度的数字——最高可达136位——但您也必须小心地正确定义精度和比例,以便它可以包含所需位数的所有中间计算

不是一个完整的答案,但一个有用的链接:

“我经常用十进制数值来计算。在某些情况下,在进行任何计算之前立即将十进制值转换为浮点值,可以获得更好的精度。”

http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/12/20/for-better-precision-cast-decimals-before-calculations.aspx

使用浮动真正的数据类型只有在,由小数提供的精度(最多38位)是不够的

  • 近似数值数据类型(见表3.3)不存储指定对于许多数字的确切值;它们存储值的非常接近近似值。(技网)

  • 避免在WHERE子句搜索条件中使用浮点或实列,特别是=和<>操作符。最好将浮动列和实列限制为>或& lt;比较。(技网)

所以通常选择Decimal作为数据类型是最好的选择

  • 你的号码可以放进去。小数精度是10E38[~ 38位数字]
  • 较小的存储空间(可能是计算速度)对你来说并不重要
  • 需要精确的数值行为,例如在金融应用程序中,在涉及舍入的操作中,或在相等检查中。(技网)

  1. 确切的数值数据类型
  • numeric = decimal(5到17字节)
    • 将映射到。net中的Decimal
    • 在SQL server中,两者都有(18,0)作为默认的(precision,scale)参数
    • 刻度=可以存储在小数点右侧的最大小数位数。
    • money(8字节)和smallmoney(4字节)也是精确数据类型,将在。net中映射为Decimal,并有4个小数点(MSDN)
  1. 近似数值数据类型
  • real(4字节)
    • 在。net中将映射为Single
    • real的ISO同义词是float(24)
  • float(8字节)
    • 在。net中将映射到Double

精确的数值数据类型 近似数值数据类型

.

主要来源: MCTS自定速度训练包(考试70-433):Microsoft®SQL Server®2008数据库开发 -第3章-表、数据类型和声明性数据完整性第1课-选择数据类型(指南)-第93页

来自MSDN: 使用十进制,浮点和真实数据的指南

数值和十进制数据类型的默认最大精度为38。 在Transact-SQL中,numeric在功能上等同于decimal 数据类型。使用十进制数据类型存储带小数的数字 当数据值必须精确地存储时

float和real的行为遵循 IEEE 754近似数值数据类型规范。由于浮动数据类型和真实数据类型的近似性质,在精确时不要使用这些数据类型 数值行为是必需的,例如在金融应用程序中 涉及舍入或相等检查的操作。相反,使用 整数、十进制、money或smallmoney数据类型。避免使用浮子 或WHERE子句搜索条件中的实列,特别是= 和<>运算符。最好限制浮动列和实列为>或< 比较。< /强> < / p >

它们的数据类型优先级不同

小数数字是相同的功能,但仍然有数据类型优先级,这在某些情况下是至关重要的。

SELECT SQL_VARIANT_PROPERTY(CAST(1 AS NUMERIC) + CAST(1 AS DECIMAL),'basetype')

结果数据类型是数字,因为它接受数据类型优先级

按优先级列出的详尽数据类型列表:

参考链接

浮动是近似值数据类型,这意味着不是数据类型范围内的所有值都可以精确表示。

十进制/数字是固定精度数据类型,这意味着数据类型范围内的所有值都可以精确地表示为精度和比例。你可以用十进制来省钱。

从Decimal或Numeric转换为float可能会导致一些精度损失。对于Decimal或Numeric数据类型,SQL Server将精度和比例的每个特定组合视为不同的数据类型。DECIMAL(2,2)和DECIMAL(2,4)是不同的数据类型。这意味着11.22和11.2222是不同的类型,尽管float不是这样。对于FLOAT(6), 11.22和11.2222是相同的数据类型。

你也可以使用数据类型来省钱。这是原生数据类型与4位精度的钱。为了省钱,大多数专家更喜欢这种数据类型。

< p >参考 1 2 3. < / p >

十进制的例子

它的潜在需求是什么?

它源于这样一个事实:最终,计算机在内部以二进制格式表示数字。这不可避免地导致舍入误差。

考虑一下:

0.1 (decimal, or "base 10") = .00011001100110011... (binary, or "base 2")

上面的省略号[…意思是“无限的”。如果你仔细看,有一个无限重复的模式(='0011')

因此,在某些情况下,计算机必须四舍五入这个值。这导致了由于重复使用存储不准确的数字而产生的累积错误。

假设您想存储财务金额(可能有小数部分的数字)。首先,显然不能使用整数(整数没有小数部分)。 从纯数学的角度来看,自然倾向于使用float。但是,在计算机中,浮点数中小数点后的部分是有限的,即“尾数”。这将导致舍入错误 为了克服这个问题,计算机提供了特定的数据类型,以限制计算机中十进制数的二进制舍入误差。这些是数据类型 绝对应该用来表示财务金额。这些数据类型通常被命名为Decimal。例如,在c#中就是这样。或者,在大多数数据库中DECIMAL

虽然这个问题不包括MONEY数据类型,但有些人可能会想使用MONEY数据类型进行财务计算。

注意MONEY数据类型,它的精度有限。

在这个Stackoverflow问题的答案中有很多关于它的好信息:

你应该在SQL Server中选择MONEY或DECIMAL(x,y)数据类型吗?< / >