SQL Server中数字,浮点数和小数点之间的区别

我在谷歌search,还访问十进制和数字和SQL Server Helper收集数字,浮点数和小数的数据types之间的差异,也找出哪一个应该在哪种情况下使用。

对于任何types的金融交易(例如工资领域),哪一个是首选的,为什么?

仅当十进制 (最多38位)提供的精度不够时才使用浮点型实型数据types

  • 近似数值数据types不存储为许多数字指定的精确值; 他们存储了一个非常接近的价值( Technet )

  • 避免在WHERE子句的search条件中使用float或real列,特别是=和<>运算符( Technet )

所以一般情况下,如果你的号码可以适应, 十进制提供精度是[10E38〜38位],而Float的较小存储空间(也许是速度)并不重要,处理exception行为和近似数值types的问题不是可以接受, 一般使用Decimal

更有用的信息

  • 数字=十进制(5到17字节)( 精确的数字数据types)
    • 将映射到.​​NET中的十进制
    • 在SQL服务器中都有(18,0)作为默认(精度,标度)参数
    • scale =可存储在小数点右侧的最大小数位数。
    • 请注意钱(8字节)和smallmoney(4字节)也是精确的,并映射到十进制在.NET中,并有4个小数点( MSDN )
    • 十进制和数字(Transact-SQL) – MSDN
  • 实际(4字节)( 近似数字数据types)
    • 将在.NET中映射到Single
    • 实际的ISO同义词是float(24)
    • float和real(Transact-SQL) – MSDN
  • float(8字节)( 近似数字数据types)
    • 将映射到.​​NET中的Double
  • 所有确切的数字types始终会产生相同的结果,无论使用何种处理器架构或数量的大小
  • 提供给float数据types的参数定义了用于存储浮点数尾数的位数
  • 近似的数字数据types通常使用较less的存储空间,速度更快(最高可达20x),您应该考虑在.NET中转换
    • C#中Decimal,Float和Double的区别是什么?
    • 小数与双倍速度
    • SQL Server – .NET数据types映射(来自MSDN)

确切的数字数据类型近似的数字数据类型

主要来源 : MCTS Self-Paced Training Kit(考试70-433):Microsoft®SQLServer®2008数据库开发 – 第3章 – 表,数据types和声明性数据完整性第1课 – select数据types(指南) – 第93页

MSDN指南: 使用小数点,浮点数和实数据

数字和小数数据types的默认最大精度为38.在Transact-SQL中,数字在function上等同于小数数据types。 当数据值必须完全按照规定存储时,使用十进制数据types来存储带有小数的数字。

float和real的行为遵循近似数值数据types的IEEE 754规范。 由于float和真实数据types的近似性质,当需要精确的数字行为时(例如在财务应用程序中,在涉及四舍五入的操作中或在相等性检查中),请不要使用这些数据types。 而是使用整数,小数,金钱或smallmoney数据types。 避免在WHERE子句的search条件中使用float或real列,特别是=和<>运算符。 最好将float和real列限制为>或<比较。

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

“我经常对十进制值进行计算,在某些情况下,在进行任何计算之前,将十进制值快速浮动以便快速浮动,会产生更好的精度。

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

它们不同于数据types优先

十进制数字function上是相同的,但仍然有数据types优先级 ,这在某些情况下可能是至关重要的。

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

结果数据types是数字,因为它需要数据types优先

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

参考链接

十进制具有固定的精度,而浮点数具有可变精度。

编辑(无法读取整个问题):浮动(53)(又名实)是在SQL Server中的双精度(32位)浮点数。 Regular Float是一个单精度浮点数。 对于大量的计算来说,Double是精确性和简单性的完美结合。 您可以使用小数创build一个非常高精度的数字 – 高达136位 – 但是您还必须小心,以便正确定义精度和缩放比例,以便可以将所有中间计算包含在必要的位数中。

浮点数是大概数字数据types,这意味着数据types范围中的所有值都不能完全表示。

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

从十进制或数字转换为浮点数可能会导致一些精度的损失。 对于“十进制”或“数字”数据types,SQL Server将每种特定的精度和比例组合视为不同的数据types。 DECIMAL(2,2)和DECIMAL(2,4)是不同的数据types。 这意味着11.22和11.2222是不同的types,虽然这不是浮动的情况。 对于FLOAT(6)11.22和11.2222是相同的数据types。

您也可以使用金钱数据types来节省资金。 这是本机数据types与4位精度为金钱。 大多数专家喜欢这种数据types,以节省资金。

参考1 2 3