2

我在这里遇到了一些奇怪的问题。我有一个数据库表,它在列上存储了巨大的价值。我的应用程序 (C#) 正在读取这个值并保持双精度类型。此应用程序会将相同的值插入到另一个表中。注意:我没有对从第一个表中读取的值进行任何计算/处理。它仅用于更新第二个表。

这里的问题是,第二个表的值与第一个表中的值略有不同。当我保持双重类型时,看起来数字正在四舍五入。

这是一个值的示例。

原值:18014398509481984

值复制到新表:18014398509482000

这些值看起来不同,但实际上两者都是相同的。我用18014398509481984 - 18014398509482000作为搜索词进行了谷歌搜索,它返回了结果0,这意味着两者都是相同的。

问题

1 - 如果两者相同,为什么第二个值看起来不同?我可以看到1984变成了2000

2 - 为什么会发生转换?

3 - 我怎样才能避免这种类型的转换?

任何帮助都会很棒!

4

4 回答 4

5

尝试使用 aSystem.Decimal来存储第一个表中的值,而不是 a System.DoubleSystem.Double似乎没有足够的有效数字来准确存储这么大的值。

于 2009-07-16T14:40:17.000 回答
3

双精度值仅精确到 15 或 16 位十进制数字(请参阅此处了解说明)。如果您需要存储更多,那么您将不得不使用不同的数字格式。如果您想在不损失准确性的情况下使用非常大的整数,那么有各种类可以帮助您喜欢这个类。

如果您从 SQL 中获取值,请确保 .NET 中的目标数据类型匹配 - 例如 C# long 的 SQL bigint - 以避免此类舍入问题。

于 2009-07-16T14:38:34.677 回答
2

我相信这是由于浮点精度(大数将使用尾数和指数),这意味着它本质上将被表示为具有幂的派系数。然而,由于浮点运算,小数会遇到舍入错误。

通常解决方法是避免浮点值(尝试 Int64),使用更精确的类型(十进制)或考虑错误并执行“近似等于”。

于 2009-07-16T14:38:56.283 回答
2

您是否需要将这些存储为浮点数?

如果不是,那么您可以改用 64 位整数:BIGINT在数据库中和long/Int64在您的应用程序中。

它们的范围从 –9,223,372,036,854,775,808 到 9,223,372,036,854,775,807,并且没有精度/准确性问题。

于 2009-07-16T14:44:10.843 回答