我在谷歌搜索过并访问了decimal and numeric和SQL Server Helper,以收集数字,浮点数和十进制数据类型之间的差异,并找出应该在哪种情况下使用哪一种。
对于任何类型的金融交易(例如工资领域),哪一个是优先的,为什么?
答案 0 :(得分:423)
仅当小数提供的精度时才使用 float 或真实数据类型(最多38位数字) )是不够的
近似数字数据类型不存储指定的确切值,用于许多数字;它们存储非常接近的近似值。(Technet)
避免在WHERE子句搜索条件中使用float或real列,尤其是=和<>运营商(Technet)
通常因为小数提供的精度是[10E38~38位],如果你的数字可以适合它,并且Float的较小存储空间(也许是速度)并不重要并且处理不接受异常行为和近似数字类型的问题,一般使用十进制。
更有用的信息
主要来源: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,会产生更好的准确性。”
答案 3 :(得分:10)
十进制和数字与功能相同,但仍有数据类型优先,这可能至关重要在某些情况下。
SELECT SQL_VARIANT_PROPERTY(CAST(1 AS NUMERIC) + CAST(1 AS DECIMAL),'basetype')
结果数据类型为数字,因为数据类型优先。
按优先级排列的详尽数据类型列表:
答案 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位数的精确度。大多数专家都喜欢这种数据类型以节省资金。
答案 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?