繁体   English   中英

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

[英]Difference between numeric, float and decimal in SQL Server

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

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

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

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

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

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

更有用的信息

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

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

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

MSDN 指南: 使用十进制、浮点数和实数数据

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

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

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

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

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

结果数据类型是数字,因为它采用数据类型优先级

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

参考链接

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

“我经常针对十进制值进行计算。在某些情况下,在任何计算之前将十进制值转换为浮点数,会产生更好的准确性。”

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

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

编辑(未能阅读整个问题):Float(53)(又名实数)是 SQL Server 中的双精度(64 位)浮点数。 常规浮点数是单精度(32 位)浮点数。 对于许多计算来说,双精度是精度和简单性的良好组合。 您可以使用十进制创建一个非常高精度的数字——最高 136 位——但您还必须小心地正确定义精度和标度,以便它可以包含所有中间计算到所需位数。

Float是 Approximate-number 数据类型,这意味着并非数据类型范围内的所有值都可以精确表示。

Decimal/Numeric是 Fixed-Precision 数据类型,这意味着数据类型范围内的所有值都可以精确地表示为精度和小数位数 您可以使用十进制来省钱。

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

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

参考1 2 3

十进制的情况

它的潜在需求是什么?

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

考虑一下:

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) 数据类型?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM