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

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

这是值的示例。

原值: 18014398509481984

值复制到新表: 18014398509482000

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

问题:

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

2 - 为什么会发生转换?

3 - 如何避免这种类型的转换?

任何帮助都会很棒!

有帮助吗?

解决方案

尝试使用System.Decimal用于存储从所述第一表中的值,而不是一个System.DoubleSystem.Double似乎不包含足够的显著位数来存储大准确的值。

其他提示

一个双精度值只精确到15张或16位十进制数(参见此处用于解释)。如果你需要存储比这更多,那么你将不得不使用不同的数字格式。如果你想不失精确度非常大整数工作,那么有各类在那里帮你喜欢这一个

如果你得到一个值从SQL的,请确保您的.NET对象的数据类型相匹配 - SQL BIGINT的C#长 - 例如,为了避免这样的问题,四舍五入

我相信这是由于浮点精度(大量将使用一个尾数的指数),这意味着它将基本上被表示为具有一个功率的派系数。然而小数遇到的舍入误差引起的浮点运算。

通常轮这个方法是避免浮点值(尝试的Int64),使用该错误的更精确的类型(十进制)或帐户,然后执行一个“约等于”。

您需要将它们存储为浮点数吗?

如果没有,那么您可以使用 64 位整数代替: BIGINT 在数据库中,以及 long/Int64 在你的应用程序中。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top