以下陈述java.lang.ArithmeticException: / by zero显而易见.
System.out.println(0/0);
Run Code Online (Sandbox Code Playgroud)
因为文字0被认为是int文字并且在整数算术中不允许除以零.
但是,以下情况不会抛出任何异常java.lang.ArithmeticException: / by zero.
int a = 0;
double b = 6.199;
System.out.println((b/a));
Run Code Online (Sandbox Code Playgroud)
它显示Infinity.
以下语句生成NaN(非数字),没有例外.
System.out.println(0D/0); //or 0.0/0, or 0.0/0.0 or 0/0.0 - floating point arithmetic.
Run Code Online (Sandbox Code Playgroud)
在这种情况下,两个操作数都被认为是双精度数.
同样,以下语句不会抛出任何异常.
double div1 = 0D/0; //or 0D/0D
double div2 = 0/0D; //or 0D/0D
System.out.printf("div1 = %s : div2 = %s%n", div1, div2);
System.out.printf("div1 == div2 : %b%n", div1 == div2);
System.out.printf("div1 …Run Code Online (Sandbox Code Playgroud) 我遇到一个问题,在使用Microsoft ACE驱动程序打开Excel电子表格后,某些计算结果似乎发生了变化.
下面的代码重现了这个问题.
前两次调用DoCalculation产生相同的结果.然后我调用OpenSpreadSheet使用ACE驱动程序打开和关闭Excel 2003电子表格的函数.你不会期望OpenSpreadSheet对最后一次调用产生任何影响,DoCalculation但事实证明结果实际上发生了变化.这是程序生成的输出:
1,59142713593566
1,59142713593566
1,59142713593495
Run Code Online (Sandbox Code Playgroud)
请注意最后3位小数的差异.这似乎不是一个很大的区别,但在我们的生产代码中,计算是复杂的,并且产生的差异非常大.
如果我使用JET驱动程序而不是ACE驱动程序没有区别.如果我将类型从double更改为十进制,则错误消失.但这不是我们的生产代码中的一个选项.
我在Windows 7 64位上运行,程序集是为.NET 4.5 x86编译的.使用64位ACE驱动程序不是一个选项,因为我们运行的是32位Office.
有谁知道为什么会发生这种情况以及如何解决这个问题?
以下代码重现了我的问题:
static void Main(string[] args)
{
DoCalculation();
DoCalculation();
OpenSpreadSheet();
DoCalculation();
}
static void DoCalculation()
{
// Multiply two randomly chosen number 10.000 times.
var d1 = 1.0003123132;
var d3 = 0.999734234;
double res = 1;
for (int i = 0; i < 10000; i++)
{
res *= d1 * d3;
}
Console.WriteLine(res);
}
public …Run Code Online (Sandbox Code Playgroud)