为什么长期在Java中加倍?

时间:2016-07-07 07:06:09

标签: java double long-integer

SSCCE:

public class Test {

    public static void main(String[] args) {
        Long a = new Long(1L);
        new A(a);
    }

    static class A {
        A(int i) {
            System.out.println("int");
        }

        A(double d) {
            System.out.println("double");
        }
    }
}

输出:

double

打印时不会出现编译错误,它可以正常工作并调用double - 参数构造函数。但为什么?

4 个答案:

答案 0 :(得分:8)

这取决于类型宣传的规则:long优先转换为double,而不是int

如果long大于doublelong可以永远适合double,但精度可能会丢失因此,你的编译器选择int构造函数比1L构造函数更合适。

(编译器不会在int 适合 .... do { QSqlQuery query(db); query.prepare("select * from Person where chatID=:chatID"); query.bindValue(":chatID",chatID); if(query.exec()) break; } while (0); db.close(); .... QSqlDatabase::removeDatabase(databaseName); 的意义上进行动态检查。< / p>

答案 1 :(得分:1)

答案 2 :(得分:1)

int为4个字节,其中longdouble为8个字节

因此,很明显,如果将数据转换为int,则有可能丢失4个字节的数据。数据类型始终是上传的。正如@Bathsheba提到的评论所述,即使使用double,也有可能丢失数据,但与int相比,损失要小得多。

Double bits

如您所见,double使用52位来存储有效数字。如果它选择int,变量将有32位可用。因此jvm选择double而不是int。

来源:Wikipedia

答案 3 :(得分:1)

# np.concatenate((self._bm_lons,self._bm_lons+360),1) np.concatenate((self._bm_lons,self._bm_lons+360)) 转换为longnarrowing primitive conversion,因为它可能会失去该值的整体幅度。将int转换为longwidening primitive conversion

编译器将自动为参数生成assignment context转换。这包括扩大原始转换,但不缩小原始转换。因为带有double参数的方法需要缩小转换,所以它不适用于该调用。