如何在 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,.Net Double 的精度是 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 decimalnumeric 和 .Net Decimal 类型。但是,与浮点相比,它们使用更多空间并且性能较低。

【讨论】:

【参考方案3】:

FLOAT 不准确。为了获得高精度,您应该将它们作为DECIMAL / NUMERIC 存储在数据库中。

【讨论】:

【参考方案4】:

您不会从 FLOAT 类型中获得精度,因为 float 是一种近似数据类型

用于浮点数值数据的近似数数据类型。浮点数据是近似的;因此,并非数据类型范围内的所有值都可以准确表示

你可以使用decimal。

【讨论】:

以上是关于如何在 MSSQL 2008 中高精度存储价值?的主要内容,如果未能解决你的问题,请参考以下文章

mssql2008数据库还原备份教程

如何查询日期时间列 - MS SQL 2008

JAVA中高精度金额计算

如何在虚拟机windows2008上安装mssql2008

mssql 存储过程调用另一个存储过程中的结果的方法分享

如何配置用非Windows管理员用户启动MSSQL 2005/2008的服务