据我所知,“2.5”自动为双倍,为了使它成为浮点数,我需要做“2.5F”(或者F应该是小写吗?),我应该使用浮点数,比方说,如果我有一个只需要2个十进制空格的常数(如安大略省PST税的“0.08F”),但我不确定“12”是int还是long,但我知道“12L”很长,但是“long l = 12”和“long l = 12L”似乎编译成相同的东西,如果我想要最大的非浮点精度,我使用long,如果我知道我不需要超出int的限制,则使用int。
如果那里有不对的东西,请纠正我,并回答我的问题。
答案 0 :(得分:14)
12作为java中的常量是一个int。
long l = 12编译的原因是它会自动扩展为long。
编辑:关于你的评论,自动扩展没有任何问题,使用任何使你的代码更清晰的东西,但只要知道在对原语进行数学运算时会发生什么。例如:
int i = 1213;
long l = 112321321L * i;
如果没有将第一个数字显式地设置为long,则long将具有非常不同的值,因为Java会将其视为整数数学,并导致溢出。
答案 1 :(得分:7)
如果在声明float
时使用小写或大写,则没有任何区别。
...像安大略省PST税的“0.08F”
如果您使用这些字段作为货币,则应考虑使用BigDecimal
。 See this explanation及其与Sun的相关链接以获取更多详细信息。
答案 2 :(得分:3)
首先,12是int
。由于您没有指定类型,因此编译器假定int
,就像它没有为2.5指定类型时假设double
一样。
作业
long x = 12;
编译得很好,因为当编译器隐式地将文字int
值12向上转换为long
时,精度不会降低。
我总是尝试使用大写类型说明符,如2.5F和12L,因为它们更容易阅读。 1和l在我喜欢的等宽字体中看起来大致相同。
答案 3 :(得分:3)
请注意,虽然int
文字在分配到long
变量时会自动扩展为long
,但在表达时需要使用明确的long
字面值值大于Integer.MAX_VALUE
(2147483647)或小于Integer.MIN_VALUE
( - 2147483648):
long x1 = 12; //OK
long x2 = 2147483648; // not OK! That's not a valid int literal
long x3 = 2147483648L; // OK