这是我正在做的一些数学的测试代码:
为什么C#以不同的方式对待它?
EXCEL
分子= = -0.161361101510599 * 10000000 分母= =( - 1 *(100-81.26))*(10000000/100)
答案 0 :(得分:4)
这很可能是由于数据在excel与C#中的表示方式。在不同的平台或使用不同的软件上进行高精度的artihmatic时,舍入误差/差异很常见。
编辑:当然可能是因为首先输入的数字不同。请找我复杂的答案!程序员因错过大局而忽略了明显的(好吧 - 我......)这个案例而臭名昭着!
答案 1 :(得分:4)
在您对另一个答案发表评论后,您说您正在获得结果(0.8610517689999946638207043757m)。如果你这样四舍五入:
Math.Round(0.8610517689999946638207043757m, 12);
输出:0,861051769000
答案 2 :(得分:3)
您的问题是您向Excel提供了与C#代码不同的初始值。你怎么期望它们是一样的?
IOW:0.161361101510599 != 0.161361102
答案 3 :(得分:2)
我们在数字计算方面工作的人并不是很多人信任Excel以正确添加2位数字。我在Mathematica中运行了你的计算,给每个小数字64位,用0s向右扩展。这是结果:
0.861051771611526147278548559231590181430096051227321237993596585
在这种情况下,请使用C#而不是Excel。并且,在第二和第三个想法,在每种情况下,使用C#而不是Excel,其数字计算的不足之处是众所周知的,并且有很好的文档记录。
答案 4 :(得分:1)
Excel存储15个有效数字的精度。阅读文章“Why does Excel Give Me Seemingly Wrong Answers?”。
答案 5 :(得分:1)
另一方面说明;你可能应该简化你的算术以减少操作次数。通常,(但并非总是)较少的操作会在f.p.中产生更好的结果。算术。
val = noiseTerm / (81.26/100 - 1)
在数学上等同于你的等式,包含3个操作而不是8个。特别是,scalingFactor完全分开,所以根本不需要。
答案 6 :(得分:1)
首先,在大多数情况下,Excel使用双精度浮点算法进行基本操作,就像C#一样。
就您的具体情况而言,您的C#代码与您的Excel公式不匹配。试试这个C#代码 - 它使用您的Excel公式:
static void Calc()
{
double numerator = -0.161361101510599 * 10000000.0;
double denominator = (-1.0 * (100.0 - 81.26)) * (10000000.0 / 100.0);
double result = numerator / denominator;
Console.WriteLine("result={0}", result);
}
运行此命令并注意输出为0.861051768999995。
现在,使用自定义数字格式“0.00000000000000000”在Excel中格式化结果,您将看到Excel为您提供与C#相同的结果。默认情况下,Excel使用“常规”格式将此数字舍入到~12位有效精度数字。通过更改为上面的格式,您强制Excel显示15位精度 - 这是Excel用于显示数字的最大有效位数(在内部,它们具有15+位数的精度,就像C#double类型一样)
您可以通过运行以下代码强制C#显示15位以上的有效数字(而不是舍入到15位有效数字):
static void Calc()
{
double numerator = -0.161361101510599 * 10000000.0;
double denominator = (-1.0 * (100.0 - 81.26)) * (10000000.0 / 100.0);
double result = numerator / denominator;
Console.WriteLine("result={0:R}", result);
}
此代码将输出0.8610517689999948 ...但AFAIK无法让Excel显示15+位数。