我有一个非常奇怪的问题,我想知道是否有人之前见过这个。 在我的数据流任务中,它截断了十几个表,然后用CSV文件的内容重新填充它们。
我有一个我要导入的字段是浮点数。在CSV中,值为7692.31,但是当我导入它时,导入的字段为7692.31005859375。我无法在CSV中的任何地方看到额外的005859375。
我已经尝试手动截断表格,并重新导入该值,我可以看到它正在被重新导入。我也检查过,其他平面文件导入都没有指向该表。此外,我已经尝试了一个只有该数量的派生列,仍然得到小数。我试图将它舍入到2位小数,我仍然得到11位小数。但如果我将它舍入为0,那么我没有得到小数位(正如预期的那样)。
所以,我有点难过。我的意思是,这些价值来自哪里?它们对于每一行都不相同,有些行甚至没有这些小数位。他们为什么不四舍五入?我认为它可能来自同时进行过多的进口,但当我删除所有其他进口时,我遇到了同样的问题。标签分隔文件中是否有隐藏字符?
任何帮助都将不胜感激。
埃里克
答案 0 :(得分:4)
这是浮点错误。基数10中的一些终止小数部分成为基数2中的重复分数。在大多数情况下,现代编程语言隐藏它或在内部处理它,但SQL中的float
和real
数据类型不会。 / p>
来自the documentation for float
and real
data types:
用于浮点数字的近似数字数据类型 数据。浮点数据是近似值;因此,并非所有的价值观 数据类型范围可以准确表示。
如果您想要精确的数字,请使用numeric
or decimal
data types,这是精确的。
编辑:对不起,我正在离开办公室的路上,结果我的匆忙中不清楚和不完整。我其实想要取消我的帖子!
完成:
此处的问题不一定与SQL Server数据类型有关,而是SSIS如何使用并转换为SQL Server数据类型。我打赌你已经将SSIS中的数据类型配置为DT_R8,因为这是双精度浮点数,that's what SSIS uses by default for float。
MS SQL Server的双精度或多或少an IEEE 754 implementation也是如此。那么,7692.31的IEEE 754表示正好恰好是7692.31005859375。找到an IEEE 754 converter online来测试它是很容易的。
因此,SSIS读取值7692.31
并将其存储为双精度浮点数。由于IEEE 754表示的工作原理,SSIS实际存储的数量为7692.31005859375
。然后它在将数据推送到数据库时插入该值。
我不确定问题是否发生在哪里,但某处在那里进行了所有数据转换,某些函数将该数字存储在其IEEE 754表示中,它以这种方式传递给SQL Server。
答案 1 :(得分:0)
在使用Float / decimal / numeric / date时,您还需要考虑检查区域设置区域以不同方式处理数据。美国可能不会将日期格式化为您的当前区域,在浮动区域中,某些区域使用,与相同。