SQL SERVER的浮点数类型及与C#的对应关系

404 阅读1分钟

SQL SERVER:

float 与 real

7位数或15位数。这里说的位数,不是指小数位,而是包括整数和小数在内的位数。

float的位数是多少,要看float[(n)]里的n数值是多少。

n value精度存储大小
1-247 位数4 字节
25-5315 位数8 字节
注意:
SQL Server 将 n 视为下列两个可能值之一。如果 1<=n<=24,则将 n 视为 24。如果 25<=n<=53,则将 n 视为 53

(是不是很怪异)

如果不写这个n,默认n是53,即15位。

real 的 ISO 同义词为 float(24), 也就是7位了。\

\

declare @f float(18) = 12345.0123456789
	,@f2 float(18) = 1234567.0123456789
	,@f3 float(18) = 123456789.0123456789
	,@f4 float(53) = 123456789.01234567890123456789;
declare @r real = 1234567.01234567890123456789;
select @f as [f],@f2 as [f2],@f3 as [f3],@f4 as [f4],@r as [real];


f                  f2                  f3                          f4                                 real
12345.01 1234567 1.234568E+08 123456789.012346 1234567\

\

decimal和numeric

带固定精度和小数位数的数值数据类型。

    • decimal
    • [
    • (
    • p
    • [
    • ,
    • s
    • ]
    • )
    • ] 和
    • numeric
    • [
    • (
    • p
    • [
    • ,
    • s
    • ]
    • )
    • ]
    • 固定精度和小数位数。使用最大精度时,有效值从 - 10^38 +1 到 10^38 - 1。decimal 的 ISO 同义词为 decdec( p, s )numeric 在功能上等价于 decimal
    • p(精度)
    • 最多可以存储的十进制数字的总位数,包括小数点左边和右边的位数。该精度必须是从 1 到最大精度 38 之间的值。默认精度为 18。
    • s

    • (小数位数)

    • 小数点右边可以存储的十进制数字的最大位数。小数位数必须是从 0 到 p 之间的值。仅在指定精度后才可以指定小数位数。默认的小数位数为 0;因此,0 <= s <= p。最大存储大小基于精度而变化。

      精度存储字节数
      1 - 95
      10-199
      20-2813
      29-3817

      \

    • \

    • 可见,decimal和numeric可以指定小数位数。如果不指定,默认是不带小数。

    • \

    • declare @d decimal = 12.0123456789,@d2 decimal(5,3) = 12.0123456789;
      select @d as [d],@d2 as [d2];
      


      d d2

    • 12 12.012\

    • \

    • \

    • money和smallmoney

    • 代表货币或货币值的数据类型。

      数据类型范围存储
      money-922,337,203,685,477.5808 到 922,337,203,685,477.58078 字节
      smallmoney-214,748.3648 到 214,748.36474 字节

      注释

      moneysmallmoney 数据类型精确到它们所代表的货币单位的万分之一。

      \

      也就是说,money和smallmoney的小数位固定是4位。

      \

      declare @m money = 123456789.0123456789;
      select @m as [money];
      


      money
      123456789.0123\

      \

      C#

      float

      \

    • float 关键字表示存储 32 位浮点值的简单类型。  下表显示了 float 类型的精度和大致范围。

      类型大致范围精度.NET Framework 类型
      float-3.4 × 10 38 到 +3.4 × 10 387 位System.Single

      \

      double

      double 关键字表示存储 64 位浮点值的简单类型。  下表显示了 double 类型的精度和大致范围。

      类型大致范围精度.NET Framework 类型
      double±5.0 × 10 −324 到 ±1.7 × 10 30815 到 16 位System.Double

      \

      decimal

      decimal 关键字表示 128 位数据类型。  同浮点型相比,decimal 类型具有更高的精度和更小的范围,这使它适合于财务和货币计算。 decimal 类型的大致范围和精度如下表所示。

      类型大致范围精度.NET Framework 类型
      decimal(-7.9 x 1028 - 7.9 x 1028) / (100 - 28)28 到 29 位有效位System.Decimal

      \

      结论

      如果只是用于价格、款项之类的数据,SQL SERVER这边可以用smallmoney、money、或者精确一些,用decimal[(p[,s])]来限定整数位数和小数位数。与之相对应,C#这里可以用decimal来赋值。C#里面,decimal类型的话,数值后面要带m或M,如0.01m。

      =======================================================================================

      网上有高人做了一个列表

      <Language From="SQL" To="C#">
      <Type From="bigint" To="long" />
      <Type From="binary" To="object" />
      <Type From="bit" To="bool" />
      <Type From="char" To="string" />
      <Type From="datetime" To="DateTime" />
      <Type From="decimal" To="decimal" />
      <Type From="float" To="double" />
      <Type From="image" To="byte[]" />
      <Type From="int" To="int" />
      <Type From="money" To="decimal" />
      <Type From="nchar" To="string" />
      <Type From="ntext" To="string" />
      <Type From="numeric" To="decimal" />
      <Type From="nvarchar" To="string" />
      <Type From="real" To="float" />
      <Type From="smalldatetime" To="DateTime" />
      <Type From="smallint" To="short" />
      <Type From="smallmoney" To="decimal" />
      <Type From="text" To="string" />
      <Type From="timestamp" To="byte[]" />
      <Type From="tinyint" To="byte" />
      <Type From="uniqueidentifier" To="Guid" />
      <Type From="varbinary" To="byte[]" />
      <Type From="varchar" To="string" />
      <Type From="xml" To="string" />
      <Type From="sql_variant" To="object" />
      </Language>
      <Language From="SQL" To="C# System Types">
      <Type From="bigint" To="System.Int64" />
      <Type From="binary" To="System.Object" />
      <Type From="bit" To="System.Boolean" />
      <Type From="char" To="System.String" />
      <Type From="datetime" To="System.DateTime" />
      <Type From="decimal" To="System.Decimal" />
      <Type From="float" To="System.Double" />
      <Type From="image" To="System.Byte[]" />
      <Type From="int" To="System.Int32" />
      <Type From="money" To="System.Decimal" />
      <Type From="nchar" To="System.String" />
      <Type From="ntext" To="System.String" />
      <Type From="numeric" To="System.Decimal" />
      <Type From="nvarchar" To="System.String" />
      <Type From="real" To="System.Single" />
      <Type From="smalldatetime" To="System.DateTime" />
      <Type From="smallint" To="System.Int16" />
      <Type From="smallmoney" To="System.Decimal" />
      <Type From="text" To="System.String" />
      <Type From="timestamp" To="System.Byte[]" />
      <Type From="tinyint" To="System.Byte" />
      <Type From="uniqueidentifier" To="System.Guid" />
      <Type From="varbinary" To="System.Byte[]" />
      <Type From="varchar" To="System.String" />
      <Type From="xml" To="System.String" />
      <Type From="sql_variant" To="System.Object" />
      </Language>

       

      <DbTarget From="SQL" To="SqlClient">
      <Type From="bigint" To="SqlDbType.BigInt" />
      <Type From="binary" To="SqlDbType.Binary" />
      <Type From="bit" To="SqlDbType.Bit" />
      <Type From="char" To="SqlDbType.Char" />
      <Type From="datetime" To="SqlDbType.DateTime" />
      <Type From="decimal" To="SqlDbType.Decimal" />
      <Type From="float" To="SqlDbType.Float" />
      <Type From="image" To="SqlDbType.Image" />
      <Type From="int" To="SqlDbType.Int" />
      <Type From="money" To="SqlDbType.Money" />
      <Type From="nchar" To="SqlDbType.NChar" />
      <Type From="ntext" To="SqlDbType.NText" />
      <Type From="numeric" To="SqlDbType.Decimal" />
      <Type From="nvarchar" To="SqlDbType.NVarChar" />
      <Type From="real" To="SqlDbType.Real" />
      <Type From="smalldatetime" To="SqlDbType.SmallDateTime" />
      <Type From="smallint" To="SqlDbType.SmallInt" />
      <Type From="smallmoney" To="SqlDbType.SmallMoney" />
      <Type From="text" To="SqlDbType.Text" />
      <Type From="timestamp" To="SqlDbType.Timestamp" />
      <Type From="tinyint" To="SqlDbType.TinyInt" />
      <Type From="uniqueidentifier" To="SqlDbType.UniqueIdentifier" />
      <Type From="varbinary" To="SqlDbType.VarBinary" />
      <Type From="varchar" To="SqlDbType.VarChar" />
      <Type From="xml" To="SqlDbType.Xml" />
      <Type From="sql_variant" To="SqlDbType.Variant" />
      </DbTarget>
      <DbTarget From="SQLCE" To="SqlServerCe">
      <Type From="bigint" To="SqlDbType.BigInt" />
      <Type From="binary" To="SqlDbType.Binary" />
      <Type From="bit" To="SqlDbType.Bit" />
      <Type From="char" To="SqlDbType.Char" />
      <Type From="datetime" To="SqlDbType.DateTime" />
      <Type From="decimal" To="SqlDbType.Decimal" />
      <Type From="float" To="SqlDbType.Float" />
      <Type From="image" To="SqlDbType.Image" />
      <Type From="int" To="SqlDbType.Int" />
      <Type From="money" To="SqlDbType.Money" />
      <Type From="nchar" To="SqlDbType.NChar" />
      <Type From="ntext" To="SqlDbType.NText" />
      <Type From="numeric" To="SqlDbType.Decimal" />
      <Type From="nvarchar" To="SqlDbType.NVarChar" />
      <Type From="real" To="SqlDbType.Real" />
      <Type From="smalldatetime" To="SqlDbType.SmallDateTime" />
      <Type From="smallint" To="SqlDbType.SmallInt" />
      <Type From="smallmoney" To="SqlDbType.SmallMoney" />
      <Type From="text" To="SqlDbType.Text" />
      <Type From="timestamp" To="SqlDbType.Timestamp" />
      <Type From="tinyint" To="SqlDbType.TinyInt" />
      <Type From="uniqueidentifier" To="SqlDbType.UniqueIdentifier" />
      <Type From="varbinary" To="SqlDbType.VarBinary" />
      <Type From="varchar" To="SqlDbType.VarChar" />
      <Type From="xml" To="SqlDbType.Xml" />
      <Type From="sql_variant" To="SqlDbType.Variant" />
      </DbTarget>

      (源文章:www.cnblogs.com/eng308/arch…

    • \