【发布时间】:2013-06-03 15:26:02
【问题描述】:
我有一个需要转换为当前形式的数据库表。此表包含三列 Double 类型(如果有人关心,则为 Pervasive.SQL)。
我的问题是这个表已经存在了很长时间,并且它已经被代码追溯到大约 15 年或更长时间了。
从历史上看,我们一直使用Double.MinValue(或当时任何等效的语言)来表示用户提供的"blank" 值。换句话说,值的缺失实际上是存储为我们以后可以识别并做出智能反应的值。
所以,今天我的问题是我需要遍历这些记录并将它们插入到一个新创建的表中(这就是我所说的“转换”)。但是,我在要转换的表中没有看到一致的值。以下是我肯定知道的:
2.2250738585072014E-308
3.99285938963E-313
3.99099435427E-313
1.1125369292536007E-308
-5.389000690742776E279
2.104687961E-314
现在,我认识到Double.MinValue 可能存在或至少被表示的其他方式。做了一些谷歌搜索,我发现第一个是Double.MinValue 的另一种表示(实际上DBL_MIN 在这里引用:http://msdn.microsoft.com/en-us/library/6bs3y5ya(v=vs.100).aspx)。
我不想太啰嗦,所以如果这些信息不足以帮助我,我会提出问题。可以这么说,我需要一种可靠的方法来发现所有以前的“最小值”值,并在循环这些数据行时将它们替换为 C# Double.MinValue 常量。
如果证明是dataRow["Value"] < someConstant,那就这样吧。但我会让数学理论家帮我下定决心。
感谢您的宝贵时间。
编辑:
当我找到这些值时,这就是我正在做的事情。它是组装要写入数据库的值的通用方法的一部分:
else if (c.DataType == typeof(System.Double))
{
if (inRow[c] == DBNull.Value)
retString += @"NULL";
else
{
Double d;
if (Double.TryParse(inRow[c].ToString(), out d))
retString += d.ToStringFull();
}
}
直到现在,它只是简单地接受了它们。这很糟糕,因为当应用程序找到它们时,它们看起来像是可接受的数据,而 不 像 Double.MinValue。因此,不被视为空白。但他们就是这样。
【问题讨论】:
-
如果您只是通过
SELECT * From Table ORDER BY YourColumn以升序查看数据会怎样。可能很容易发现存在巨大差距和真实数据开始的地方。 -
我希望您将它们作为
null存储在新表中 -
最小的“真实”值有多小?任何负值都是“真实的”吗? 0 是“真实的”吗?
-
@DonBoitnott:你应该听取这些人的建议,而不是无视它;你这里的这个系统被破坏得惊人。现在是修复它的时候了,而不是让它的破损更加一致。无效的双精度值应始终表示为数据库空值或双精度 NaN 值,从不为非常小的正数或非常大的负数。
-
@DonBoitnott 如果您提出问题,希望人们会质疑您的整个方法。所有健康的技术社区都因批评而兴旺发达。批评不是坏事。只有通过批评,我们才能提高。因此,您可以选择忽略建议,但不要指望我们会停止提供建议。
标签: c# floating-point double