我在这里遇到一些奇怪的问题。我有一个数据库表,其中存储了巨大的值。我的应用程序(C#)正在读取此值并保持 double 类型。此应用程序将相同的值插入另一个表。注意:我没有对从第一个表读取的值进行任何计算/处理。它仅用于更新第二个表。
问题在于,第二个表的值与第一个表的值略有不同。当我保持双重类型时,看起来数字正在四舍五入。
以下是值的示例。
原始值: 18014398509481984
复制到新表的值: 18014398509482000
值看起来不同,但两者在现实中是相同的。我用 18014398509481984 - 18014398509482000 作为搜索字词进行谷歌搜索,并返回结果 0 ,这意味着两者是一样的
问题:
1 - 如果两者相同,为什么第二个值看起来不同?我可以看到 1984 变成 2000 。
2 - 转换为何会发生?
3 - 如何避免此类转换?
任何帮助都会很棒!
答案 0 :(得分:5)
尝试使用System.Decimal
来存储第一个表中的值,而不是System.Double
。 System.Double
似乎没有足够的有效数字来准确存储这么大的值。
答案 1 :(得分:3)
双精度值仅精确到15或16位十进制数字(有关说明,请参阅here)。如果您需要存储更多,则必须使用不同的数字格式。如果你想在不失真确的情况下使用非常大的整数,那么有各种各样的课程可以帮助你更喜欢this one。
如果你从SQL中获取了一个值,请确保.NET中的目标数据类型匹配 - 例如C#的SQL bigint - 以避免像这样的舍入问题。
答案 2 :(得分:2)
我认为这是由于浮点精度(大数将使用尾数指数),这意味着它基本上表示为具有幂的派系数。但是,小数会因浮点运算而遇到舍入误差。
通常,绕过这一点的方法是避免浮点值(尝试Int64),使用更精确的类型(十进制)或说明错误并执行'大约等于'。
答案 3 :(得分:2)