C vs Java原始转换和表达式

时间:2012-02-24 01:43:13

标签: java c casting expression primitive

为什么这个等式在C(32位)和Java(64位)中为e生成两个不同的值?它们的数量出乎意料地大了很多。

int a, b, c, d;
double e;

a = -12806;
b = 1;
c = 800;
d = 19209;

double f = (32768 / 10.24);

e = (a + (double) b / c * d) / f;

C产生-3.9940624237060547。 Java生成-3.9943714843750002。

更新:

很抱歉,这个错误似乎不是我预期的。我把我的代码简化为这个等式,它产生的数字更接近。

2 个答案:

答案 0 :(得分:1)

在Java中,隐式括号有点不同:

    int a, b, c, d;
    double e;

    a = 3;
    b = 4;
    c = 5;
    d = 6;
    e = a + (double) b / c * d;
    System.out.println("e=" + e);
    e = a + (((double) b) / c) * d; // Java: 7.8
    System.out.println("e=" + e);

如果你在C中运行它,你会看到差异。

答案 1 :(得分:0)

这已在这里得到解答:

Retain precision with double in Java

你最好的选择是使用BigDecimals,因为它们保持这种精确度。