Java隐式转换会导致精度或幅度损失吗?

时间:2012-12-19 10:31:02

标签: java compiler-errors precision

我最近learned,在将一些Java代码转换为C#时,Java的增量运算符'+ ='隐式转换为LHS的类型:

int i = 5;
long lng = 0xffffffffffffL;  //larger than Int.MAX_VALUE
i += lng;                    //allowed by Java (i==4), rejected by C#

相当于:(details here

int i = 0;
long lng = 0xffffffffffffL;
i = (int)(i + lng);
因而无声地造成了失去幅度的机会。

C#在编译时对此更加认真:
    Cannot convert source type long to target type int.

Java是否还允许其他类似情况?

1 个答案:

答案 0 :(得分:4)

long可以被提升为float或double,这会导致精度下降:

public static void main(String[] args) {
    float f = Long.MAX_VALUE;
    double d = Long.MAX_VALUE;

    System.out.println(Long.MAX_VALUE);
    System.out.println(f);
    System.out.println(d);

}

打印

9223372036854775807
9.223372E18
9.223372036854776E18

我怀疑C#是这样做的。

除了您已经提到的复合赋值运算符之外,我相信那些隐式转换可以改变值的情况。