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

Difference between numeric, float and decimal in SQL Server

我在Google中搜索,还访问了decimal、numeric和SQL Server Helper,以收集numeric、float和decimal数据类型之间的差异,并找出在哪种情况下应该使用哪种数据类型。

对于任何类型的财务事务(例如,对于薪资字段),哪一个是首选的,为什么?


use the float or real data types only if the precision provided by decimal (up to 38 digits) is insufficient

    百万千克1

    近似数字数据类型不存储为许多数字指定的精确值;它们存储的值非常接近。(technet)

    百万千克1百万千克1

    避免在WHERE子句搜索条件中使用浮点或实列,尤其是=和<>运算符(technet)

    百万千克1

因此,一般情况下,由于十进制提供的精度是[10e38~38位],如果您的数字可以容纳它,并且较小的浮点存储空间(可能是速度)并不重要,处理异常行为和近似数字类型的问题是不可接受的,所以一般使用十进制。

更有用的信息

    百万千克1numeric=十进制(5到17字节)(精确数字数据类型)

      百万千克1将映射到.NET中的十进制百万千克1百万千克1在SQL Server中,两者都有(18,0)作为默认(精度,比例)参数百万千克1百万千克1小数位数=小数点右边可以存储的最大小数位数。百万千克1百万千克1请注意,money(8字节)和smallmoney(4字节)也是精确的,在.net中映射到decimal,并且有4个小数点(msdn)百万千克1百万千克1十进制和数字(Transact-SQL)-msdn百万千克1

    型百万千克1百万千克1实数(4字节)(近似数字数据类型)

      百万千克1将映射到.NET中的单个百万千克1百万千克1real的iso同义词是float(24)百万千克1百万千克1浮点实数(Transact-SQL)-msdn百万千克1

    型百万千克1百万千克1浮点(8字节)(近似数字数据类型)

      百万千克1将映射到.NET中的Double百万千克1

    型百万千克1百万千克1无论哪种类型,所有精确的数值类型都会产生相同的结果。正在使用处理器体系结构或数字的大小百万千克1百万千克1提供给float数据类型的参数定义了用于存储浮点数的尾数。百万千克1百万千克1近似数字数据类型通常使用较少的存储空间,具有更好的速度(高达20倍),而且在.NET中转换它们时,还应该考虑

      百万千克1C中的小数、浮点数和双精度数有什么区别#百万千克1百万千克1十进制与双速百万千克1百万千克1SQL Server-.NET数据类型映射(来自msdn)百万千克1

    型百万千克1

Exact Numeric Data Types。氧化镁

主要来源:MCTS自定步调培训工具包(考试70-433):微软?SQL Server?2008数据库开发-第3章-表、数据类型和声明性数据完整性第1课-选择数据类型(指南)-第93页


来自msdn的指南:使用十进制、浮点和实数数据

The default maximum precision of numeric and decimal data types is 38.
In Transact-SQL, numeric is functionally equivalent to the decimal
data type. Use the decimal data type to store numbers with decimals
when the data values must be stored exactly as specified.

The behavior of float and real follows the
IEEE 754 specification on approximate numeric data types. Because of the approximate nature of the float and real data types, do not use these data types when exact
numeric behavior is required, such as in financial applications, in
operations involving rounding, or in equality checks. Instead, use the
integer, decimal, money, or smallmoney data types. Avoid using float
or real columns in WHERE clause search conditions, especially the =
and <> operators. It is best to limit float and real columns to > or < comparisons.


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

"我经常根据十进制值进行计算。在某些情况下,在进行任何计算之前,尽快将十进制值转换为浮点值,可以获得更好的精度。"

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


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

decimal和numeric在功能上是相同的,但仍然有数据类型优先权,在某些情况下这可能是至关重要的。

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

结果数据类型是数字的,因为它具有数据类型优先权。

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

参考链接


十进制的精度是固定的,而浮点的精度是可变的。

编辑(阅读整个问题失败):float(53)(又称real)是SQL Server中的双精度(32位)浮点数。普通浮点数是一个单精度浮点数。对于许多计算来说,double是精度和简单性的良好组合。您可以创建一个非常高精度的十进制数字——高达136位——但是您还必须小心定义您的精度和比例,以便它可以包含所有中间计算到所需的位数。


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

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

从十进制或数字到浮点的转换可能会导致一些精度损失。对于十进制或数字数据类型,SQL Server将精度和小数位数的每个特定组合视为不同的数据类型。decimal(2,2)和decimal(2,4)是不同的数据类型。这意味着11.22和11.2222是不同的类型,尽管这不是浮动的情况。对于float(6),11.22和11.2222是相同的数据类型。

您还可以使用money数据类型来省钱。这是本地数据类型,货币精度为4位。大多数专家为了省钱而喜欢这种数据类型。

参考1个二三


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

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

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

您应该在SQL Server中选择money或decimal(x,y)数据类型吗?


型十进制的情况

根本需要什么?

它产生于这样一个事实:最终,计算机在内部以二进制格式表示数字。这必然导致舍入误差。

考虑一下:

1
0.1 (DECIMAL, OR"base 10") = .00011001100110011... (BINARY, OR"base 2")

abose省略号[…]表示"无限"。如果你仔细观察它,就会发现一个无限重复的模式(‘0011’)

所以,在某种程度上,计算机必须舍入这个值。这会导致因重复使用不准确存储的数字而产生的累积误差。

假设您想要存储财务金额(这是可能包含小数部分的数字)。首先,显然不能使用整数(整数没有小数部分)。从纯数学的角度来看,自然倾向于使用float。但是,在计算机中,浮点数的一部分位于小数点后,"尾数"是有限的。这会导致舍入误差。

为了克服这个问题,计算机提供特定的数据类型,以限制计算机中十进制数的二进制舍入误差。这些是应绝对用于表示财务金额。这些数据类型通常使用Decimal的名称。例如,在C中就是这样。或者,大多数数据库中的Decimal