有没有人能解释一下,为什么在Excel和C#中使用完全相同的数字时,我会看到非常小的(10^-08)数字差异?
我有一个公式,并使用相同的输入。在Excel中我得到一个数字-在C#中我得到另一个数字。差别很小。
我在C#中使用双精度,并做除法运算。我试过使用小数,但没有多大区别。
编辑:这快把我逼疯了--我整个上午都在这上面--有什么想法吗?
发布于 2010-02-11 13:35:50
这是由于c#和excel中不同的MidPoint舍入规则造成的。
试试Math.Round(someNumber,precision,MidpointRounding.AwayFromZero);
发布于 2010-02-11 14:06:32
由于差异如此之小(您所说的是10^-08),我怀疑是中间计算导致了问题。请注意,双精度值为64位,但寄存器可以80位精度工作。因此,如果你有一个代码序列,编译器将把所有的中间计算保存在寄存器中,那么实际上你将获得比代码中不同点进行相同计算的精度更高的精度,强制中间结果保存在64位存储位置。
如果将值作为计算的一部分存储在Excel单元格中,这也会导致将中间计算截断为64位精度。
您确实需要显示您的代码:显示两个:(a) Excel计算(它是工作表公式还是对单元格值进行编程赋值?)以及(b)您正在进行的C#计算。如果你这样做,那么我们应该能够更准确地帮助你。但根据您到目前为止提供的信息,我们只能做出粗略的猜测。
--迈克
发布于 2010-02-11 14:50:56
这个话题以前也让我抓狂=)。
几年前,我发现Excel的工作表=ROUND()
函数产生的结果与VBA的ROUND()
函数不同。我还发现,VBA和MySQL版本4.x (不记得确切的版本;在5.x之前)使用完全相同的算法对浮点数类型进行舍入。他们似乎使用了一个有缺陷的“银行家舍入”版本。MySQL最终在未来的版本中改变了它们的取整方式,但有人指出,Vba4.x实现ROUND
的方式之间的相似性可能是因为它们都依赖于C编程语言(可能用于创建VBA和MySQL)实现ROUND
的方式。
VBA和MySQL 4.x都简单地实现了C语言用来实现舍入的东西。然而,许多当代编程语言出于各种原因选择了自己的舍入方法;有时是为了符合IEEE规范,有时是为了匹配他们认为用户将会期望的结果。
您可以尝试阅读这篇文章,以获得关于VBA舍入的主题的进一步说明:http://www.vb-helper.com/howto_round_to_specified_digits.html
https://stackoverflow.com/questions/2243966
复制相似问题