Excel与C#数字差异

时间:2010-02-11 11:02:16

标签: c# excel

任何人都可以了解为什么在Excel与C#中使用完全相同的数字时,我可能会看到非常小的(10 ^ -08)数字差异

我有一个公式并使用相同的输入。在Excel中我得到一个数字 - 在C#中我得到另一个数字。差别很小。

我在C#中使用双打并进行分组。我已经尝试使用小数字,这并没有太大的区别

编辑:这让我开始努力 - 我整个上午都花了这么多 - 任何想法?

4 个答案:

答案 0 :(得分:3)

如此小的差异(10 ^ -08,你指出),我怀疑中间计算导致问题。请注意,双精度值为64位,但寄存器可以使用80位精度。因此,如果你有一个代码序列,编译器会将所有中间计算保留在寄存器上,那么实际上会比在代码中的不同点进行相同计算时获得更好的精度,从而强制中间结果保持在64位存储位置。

如果您在Excel单元格中存储值作为计算的一部分,这也会导致将中间计算截断为64位精度。

您真的需要显示您的代码:显示(a)Excel计算(它是工作表公式还是您对单元格值进行编程分配?)和(b)您正在进行的C#计算。如果你这样做,那么我们应该能够更准确地帮助你。但是根据你迄今给出的信息,我们只能做出广泛的猜测。

- 迈克

答案 1 :(得分:2)

不同之处在于c#和excel中的MidPoint Rounding规则不同。

尝试Math.Round(someNumber,precision,MidpointRounding.AwayFromZero);

答案 2 :(得分:0)

这个主题也让我疯狂了=)。

几年前,我发现Excel的工作表=ROUND()函数产生的结果与VBA的ROUND()函数不同。我还发现VBA和MySQL版本4.x(不记得确切的版本;在5.x之前)使用完全相同的算法来舍入浮点数类型。他们似乎正在使用一个有缺陷的“银行家的四舍五入”。 MySQL最终在未来的版本中更改了它们的舍入,但是有人指出VBA和MySQL 4.x实现ROUND的方式之间的相似性可能是由于它们都依赖于C编程语言的方式(可能使用)创建VBA和MySQL)实现Round。

VBA和MySQL 4.x都简单地实现了C用来实现舍入的功能。然而,许多当代编程语言已经选择出于各种原因推出自己的舍入方法;有时候它符合IEEE规范,有时它会匹配用户期望的内容。在VBA和MySQL 4.x的情况下,用户从未预料到银行家四舍五入的有缺陷的版本(因此您感到沮丧),因此未来的语言实现了新版本的舍入或提供的替代方案(例如decimal类型在C#中,这样用户就能够产生预期的值并对整个过程有更多的控制。

您可以尝试查看本文,以便在参考VBA的舍入时进一步阐明该主题: http://www.vb-helper.com/howto_round_to_specified_digits.html

答案 3 :(得分:0)

您确定在Excel中看到了整个号码吗?

格式化为“常规”的数字将以~12位精度显示(如果列不足以容纳~12位,则显示更少)。例如,如果将公式“= PI()”放入具有“常规”格式(Excel中的默认值)的单元格中并使列足够宽,则会看到3.141592654。请注意,如果列不够宽,您将看到更少的精度数字。

现在,格式化具有自定义数字格式“0.00000000000000000”的单元格,您将看到3.14159265358979000(如果列足够宽)。

请注意,Excel实际上在内部存储了= PI()的值,其精度超过15位。您可以通过在单元格中输入“=(PI() - 3.14159265358979)”来查看此内容 - 请确保在公式中包含括号。

现在,只是为了好玩,在单元格中输入“= PI() - 3.14159265358979”,你会看到你得到零。在某些情况下,例如在结果“几乎为零”的地方加或减,Excel实际上会将结果转换为0.0(如果您不知道它正在发生,这可能会让您发疯)。