【问题标题】:Incorrect sum of decimal values in vb.netvb.net中的十进制值总和不正确
【发布时间】:2013-04-19 09:00:27
【问题描述】:

我正在从 T-SQL 过程中提取数据,我的一列被转换为 numeric(18,2)

当我运行此程序并将数据复制到 excel 时,此列的总和比我在 vb.net 上运行时得到的总和少 0.01。

在 vb.net 中,我将列的值聚合到字典中(字符串,十进制)

我不知道为什么会这样。

   If Not dr.IsDBNull(dr.GetOrdinal(f.field)) Then
        Dim dval = If(dr.IsDBNull(dr.GetOrdinal(f.field)), 0D, dr.GetDecimal(dr.GetOrdinal(f.field)))
        di.Add(New FieldValue With {.Type = f, .Value = If(rpt.allow_negatives, dval, Math.Abs(dval))}, rpt.overide_format)
        If rpt.has_total AndAlso f.totaled Then totals(f.field) += dval
    Else
        di.Add(New FieldValue With {.Type = f, .Value = 0D})
    End If

【问题讨论】:

  • 我正在使用 Math.Abs​​ ...这将返回一个双精度数。在十进制和双精度之间转换会是个问题吗?
  • Math.Abs​​ 甚至有一个小数重载......所以这不太可能是问题

标签: sql sql-server vb.net decimal


【解决方案1】:

Math.Abs​​ 有一个decimal 过载,所以可能不是这样。更有可能是 Excel 计算错误。 Excel 通常会丢弃超过 15 位精度的任何内容。

见:http://en.wikipedia.org/wiki/Numeric_precision_in_Microsoft_Excel

要向自己证明这一点,请键入

 1234567890123456.78

到 Excel 单元格中。你会看到这个数字最终是:

 1234567890123450

【讨论】:

  • @j 我的总数远小于 VB 中的 96101515696.33 但 excel 中的 96101515696.32
  • @CharlesO - 我仍然怀疑 Excel。您的总精度为 15 位中的 13 位,并且 Excel 正在将您的所有值转换为双精度。并非您的所有值都可以精确地表示为双精度值,因此它们都会收集大约 15-17 位精度的错误。如果你要添加很多数字,这真的可以加起来。这就是存在decimal 格式的原因。您可以重新编码您的 VB 以使用 double 而不是 decimal 并查看是否获得与 Excel 相同的结果。
  • @j 这很奇怪...我从 t-sql 确保 numeric(18,2) 正确,以确保我只处理 2 个小数位。
  • @CharlesO - 是的,只有两位小数,但您也有多达 13 位的精度。当您转换为双倍(即:在 Excel 中)时,您总是有剩菜。例如 - 12345.68 作为双精度不能完全表示。最接近的双精度数是 1.23456800000000002910383045673E4 - 因此您开始在精度的第 18 位累积误差。在将这些错误累加到大量值上之后,您开始看到错误逐渐上升到更高的精度数字。这不是关于小数位,而是关于精度的数字。
  • @CharlesO - 你可能想试试这个:office.microsoft.com/en-ca/excel-help/…
猜你喜欢
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 2022-10-01
  • 2022-12-03
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
相关资源
最近更新 更多