SQL Server中数字,浮点数和小数之间的差异

时间:2009-06-29 02:22:16

标签: sql sql-server types

我在谷歌搜索过并访问了decimal and numericSQL Server Helper,以收集数字,浮点数和十进制数据类型之间的差异,并找出应该在哪种情况下使用哪一种。

对于任何类型的金融交易(例如工资领域),哪一个是优先的,为什么?

8 个答案:

答案 0 :(得分:423)

  

仅当小数提供的精度时才使用 float 真实数据类型(最多38位数字) )是不够的

  • 近似数字数据类型不存储指定的确切值,用于许多数字;它们存储非常接近的近似值。(Technet

  • 避免在WHERE子句搜索条件中使用float或real列,尤其是=和<>运营商(Technet

通常因为小数提供的精度是[10E38~38位],如果你的数字可以适合它,并且Float的较小存储空间(也许是速度)并不重要并且处理不接受异常行为和近似数字类型的问题,一般使用十进制

更有用的信息

  • numeric = decimal(5到17个字节)(完全数字数据类型)
    • 将映射到.​​NET中的Decimal
    • 在SQL Server
    • 中都有(18,0)作为默认(精度,比例)参数
    • scale =可以存储在小数点右侧的最大小数位数。
    • 请注意,钱(8字节)和smallmoney(4字节)也是精确的,并映射到十进制在.NET中并有4个小数点(MSDN
    • decimal and numeric (Transact-SQL) - MSDN
  • real(4字节)(近似数字数据类型)
  • float(8字节)(近似数字数据类型)
    • 将映射到.​​NET中的Double
  • 所有完全数字类型始终产生相同的结果,无论哪种类型 处理器架构的使用或数字的大小
  • 提供给float数据类型的参数定义了位数 用于存储浮点数 mantissa
  • 近似数字数据类型通常使用较少的存储空间并且速度更快(最多20倍),您还应该考虑它们何时在.NET中转换

Exact Numeric Data Types Approximate Numeric Data Types

主要来源MCTS Self-Paced Training Kit (Exam 70-433): Microsoft® SQL Server® 2008 Database Development - 第3章 - 表格,数据类型和声明性数据完整性第1课 - 选择数据类型(指南) - 第93页

答案 1 :(得分:21)

MSDN指南:Using decimal, float, and real Data

  

数字和十进制数据类型的默认最大精度为38。   在Transact-SQL中,数字在功能上等效于小数   数据类型。 使用小数数据类型存储带小数的数字   当数据值必须完全按照指定存储时。

     

float和real的行为遵循   有关近似数值数据类型的IEEE 754规范。由于float和实际数据类型的近似性质,请不要在准确时使用这些数据类型   需要数字行为,例如在财务应用程序中   涉及舍入或平等检查的操作。相反,使用   整数,小数,金钱或小数据数据类型。避免使用浮动   或WHERE子句搜索条件中的实列,尤其是=   和<>运营商。 最好将浮点数和实数列限制为>或者<   比较。

答案 2 :(得分:12)

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

“我经常对十进制值进行计算。在某些情况下,在进行任何计算之前,将十进制值投射到ASAP,会产生更好的准确性。”

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

答案 3 :(得分:10)

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

十进制数字功能相同,但仍有数据类型优先,这可能至关重要在某些情况下。

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

结果数据类型为数字,因为数据类型优先

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

Reference link

答案 4 :(得分:6)

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

编辑(未能阅读整个问题): Float(53)(又名真实)是SQL Server中的双精度(32位)浮点数。 Regular Float是单精度浮点数。对于大量计算,Double是精确和简单的良好组合。您可以使用十进制创建一个非常高精度的数字 - 最多136位 - 但您还必须注意正确定义精度和比例,以便它可以包含所有中间计算到必要的位数。

答案 5 :(得分:2)

Float 是近似数字数据类型,这意味着并非所有数据类型范围内的值都可以准确表示。

十进制/数字是固定精度数据类型,这意味着数据类型范围中的所有值都可以精确和精确地表示。您可以使用小数来节省金钱。

从Decimal或Numeric转换为float会导致一些精度损失。对于十进制或数字数据类型,SQL Server将每个特定的精度和比例组合视为不同的数据类型。 DECIMAL(2,2)和DECIMAL(2,4)是不同的数据类型。这意味着11.22和11.2222是不同的类型,但浮动不是这种情况。对于FLOAT(6),11.22和11.2222是相同的数据类型。

您还可以使用 money 数据类型来节省资金。这是本机数据类型,有4位数的精确度。大多数专家都喜欢这种数据类型以节省资金。

参考 1 2 3

答案 6 :(得分:1)

十进制的情况

潜在需求是什么?

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

考虑一下:

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

空位省略号表示“无限”。如果仔细看,会有无限的重复模式(='0011')

因此,在某些时候计算机必须舍入该值。这会由于重复使用不精确存储的数字而导致累积错误。

说您要存储财务金额(可能是小数的数字)。首先,您显然不能使用整数(整数没有小数部分)。 从纯粹的数学观点来看,自然的趋势是使用float。但是,在计算机中,浮点数是位于小数点后的数字部分(“尾数”)的限制。这会导致舍入错误。

为克服此问题,计算机提供了特定的数据类型,这些数据类型限制了计算机中十进制数字的二进制舍入错误。这些是数据类型 应该绝对用来代表财务金额。这些数据类型通常使用Decimal的名称。例如,在C#中就是这种情况。或者,在大多数数据库中,DECIMAL

答案 7 :(得分:1)

尽管问题不包括MONEY数据类型,但一些遇到此线程的人可能会倾向于使用MONEY数据类型进行财务计算。

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

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

Should you choose the MONEY or DECIMAL(x,y) datatypes in SQL Server?