【问题标题】:Exporting Floating Table data in SQL Server 2008 R2在 SQL Server 2008 R2 中导出浮动表数据
【发布时间】:2015-09-10 22:45:04
【问题描述】:

我正在尝试将包含一些 nvarchar(与实际问题无关)和 float 列(出现问题的位置)的数据库表导出到平面文件。

问题是,当我使用 SQL Server 2008 R2 x64 中的导入/导出向导将表导出到平面文件时,浮点列会出现一些与舍入/精度相关的“奇怪”行为。

例如,如果存储在列中的“实际”值是 137691869,04,那么在导出的文件中我会得到 137691869,03999999 而不是 137691869,04。

如何解决该问题以便在导出的平面文件中获得“准确”值?

谢谢!

【问题讨论】:

  • 根据定义,您无法从浮点数中获取“精确”值。浮点数是近似的日期类型。如果你想要精确,你应该使用一个精确的数据类型,比如数字。
  • 是的,但是 Float(137691869,04) = 137691869,04。即数字137691869,04的浮点表示是同一个数字。问题是,为什么如果数字在数据库表中存储为 137691869,04,导出时我得到 137691869,03999999 而不是 137691869,04?
  • 因为浮点数是近似的,而在 sql server 中,这两个“值”是相同的。选择 1 其中 CAST(137691869.03999999 作为浮点数) = CAST(137691869.04 作为浮点数)
  • 亲爱的@SeanLange 实际上 137691869,03999999 在浮点意义上与 137691869,04 “相等”,但在平面文件中我需要得到 137691869,04。
  • 正如我之前所说,如果您想要精确,那么要么在导出期间转换您的列,要么使用精确的数字。

标签: sql-server sql-server-2008-r2 export-to-csv


【解决方案1】:

导出截断时应该使用round():

SELECT ROUND(137691869.03999999, 2) 

将返回值 137691869.04

如果您不喜欢在您的服务器版本中进行四舍五入,您可以尝试其他相关函数:TRUNC()、NUMERIC()、DECIMAL()

我不管数怎么存,round只影响输出:

SELECT ROUND(137691869.04, 2) 

将返回值 137691869.04

【讨论】:

  • 感谢您的帮助。但是该数字在数据库表中存储为 137691869,04,但导出时我得到 137691869,03999999 而不是 137691869,04。
猜你喜欢
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
相关资源
最近更新 更多