相关疑难解决方法(0)

为什么用浮点(或双精度)数除零不会在Java中抛出java.lang.ArithmeticException:/ by

以下陈述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)

java exception dividebyzeroexception arithmeticexception

57
推荐指数
4
解决办法
4万
查看次数

Microsoft ACE驱动程序更改程序其余部分的浮点精度

我遇到一个问题,在使用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)

.net floating-point excel jet

5
推荐指数
1
解决办法
946
查看次数