如何在 MSSQL 2008 中高精度存储价值?
Posted
技术标签:
【中文标题】如何在 MSSQL 2008 中高精度存储价值?【英文标题】:How to store value in MSSQL 2008 with high precision? 【发布时间】:2013-01-11 10:51:45 【问题描述】:我在 VisualStudio 端有 Double 类型的值。
我需要将此值以浮点列类型存储在 MSSQL 2008 中。
问题是我的值的精度是点后十七位,
在 SQL 端,最后几位数字被截断和四舍五入。
知道如何让 SQL 服务器保持原样(即不更改最后一位)吗?
提前谢谢你!
【问题讨论】:
用十进制类型代替浮点数怎么样? 根据 MSDN,.NetDouble
的精度是 15 位或 16 位,而不是 17 位。msdn.microsoft.com/en-gb/library/678hzkk9(v=vs.110).aspx
您真的需要高达 17 位的精度吗?
【参考方案1】:
使用 Decimal 数据类型而不是 float。
这是一个例子
DECIMAL(30, 17)
30 = 小数位数的最大总数
17 = 小数点右侧可存储的最大小数位数。
更多内容
http://msdn.microsoft.com/en-us/library/aa258832(v=sql.80).aspx
【讨论】:
【参考方案2】:.Net Double
和 MSSQL 服务器 float
是近似数值数据类型。
它们提供了一种存储"real" 号码的有效方式。在内部,它们被存储为两个精确的二进制数,基数(matissa)和乘数(指数)。他们的精度根据这两个精确二进制数的相对大小而变化,尤其是尾数。使用这些 floating point numbers 的操作在现代处理器上进行了优化,尤其是 GPU。
在数字的小端,范围内的每个实数都没有二进制值。当用于存储数字的各个比率不同时,这些间隙是交错的,并且在转换比率之间的数字时会出现小的舍入误差。使用浮点数就是这样。当浮点数用于表示自然数据时,任何一种方式的五分之一都没有太大区别。
如果你真的需要额外的精度,你应该使用 MSSQL decimal
或 numeric
和 .Net Decimal
类型。但是,与浮点相比,它们使用更多空间并且性能较低。
【讨论】:
【参考方案3】:FLOAT
不准确。为了获得高精度,您应该将它们作为DECIMAL / NUMERIC 存储在数据库中。
【讨论】:
【参考方案4】:您不会从 FLOAT 类型中获得精度,因为 float 是一种近似数据类型
用于浮点数值数据的近似数数据类型。浮点数据是近似的;因此,并非数据类型范围内的所有值都可以准确表示
你可以使用decimal。
【讨论】:
以上是关于如何在 MSSQL 2008 中高精度存储价值?的主要内容,如果未能解决你的问题,请参考以下文章