四舍五入[c#]

时间:2009-07-16 14:35:12

标签: c# math double rounding

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

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

以下是值的示例。

原始值: 18014398509481984

复制到新表的值: 18014398509482000

值看起来不同,但两者在现实中是相同的。我用 18014398509481984 - 18014398509482000 作为搜索字词进行谷歌搜索,并返回结果 0 ,这意味着两者是一样的

问题

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

2 - 转换为何会发生?

3 - 如何避免此类转换?

任何帮助都会很棒!

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

双精度值仅精确到15或16位十进制数字(有关说明,请参阅here)。如果您需要存储更多,则必须使用不同的数字格式。如果你想在不失真确的情况下使用非常大的整数,那么有各种各样的课程可以帮助你更喜欢this one

如果你从SQL中获取了一个值,请确保.NET中的目标数据类型匹配 - 例如C#的SQL bigint - 以避免像这样的舍入问题。

答案 2 :(得分:2)

我认为这是由于浮点精度(大数将使用尾数指数),这意味着它基本上表示为具有幂的派系数。但是,小数会因浮点运算而遇到舍入误差。

通常,绕过这一点的方法是避免浮点值(尝试Int64),使用更精确的类型(十进制)或说明错误并执行'大约等于'。

答案 3 :(得分:2)

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

如果没有,则可以使用64位整数:数据库中为BIGINT,应用中为long / Int64

这些范围从-9,223,372,036,854,775,808到9,223,372,036,854,775,807,没有精确/准确性问题。