题
我在这里遇到一些奇怪的问题。我有一个数据库表,其中的列上存储着巨大的价值。我的应用程序(C#)正在读取该值并保存在 双倍的 类型。该应用程序会将相同的值插入到另一个表中。笔记 :我没有对从第一个表读取的值进行任何计算/处理。它只是保留用于更新第二个表。
这里的问题是,第二个表的值与第一个表中的值略有不同。当我保持双精度类型时,看起来数字正在四舍五入。
这是值的示例。
原值: 18014398509481984
值复制到新表: 18014398509482000
两者的值看起来不同,但实际上是相同的。我用谷歌搜索了 18014398509481984 - 18014398509482000 作为搜索词并返回结果 0, ,这意味着两者相同。
问题:
1 - 如果两者相同,为什么第二个值看起来不同?我可以看到 1984 转换成 2000.
2 - 为什么会发生转换?
3 - 如何避免这种类型的转换?
任何帮助都会很棒!
解决方案
尝试使用System.Decimal
用于存储从所述第一表中的值,而不是一个System.Double
。 System.Double
似乎不包含足够的显著位数来存储大准确的值。
其他提示
一个双精度值只精确到15张或16位十进制数(参见此处一>用于解释)。如果你需要存储比这更多,那么你将不得不使用不同的数字格式。如果你想不失精确度非常大整数工作,那么有各类在那里帮你喜欢这一个。
如果你得到一个值从SQL的,请确保您的.NET对象的数据类型相匹配 - SQL BIGINT的C#长 - 例如,为了避免这样的问题,四舍五入
我相信这是由于浮点精度(大量将使用一个尾数的指数),这意味着它将基本上被表示为具有一个功率的派系数。然而小数遇到的舍入误差引起的浮点运算。
通常轮这个方法是避免浮点值(尝试的Int64),使用该错误的更精确的类型(十进制)或帐户,然后执行一个“约等于”。