我正在开发以下代码
static String m(float i) {
return "float";
}
static String m(double i) {
return "double";
}
public static void main(String[] args) {
int a1 = 1;
long b1 = 2;
System.out.print(m(a1) + "," + m(b1));
}
两者都导致输出浮动,浮动,请问建议的原因是什么,如何打电话给双,请多多指教。
答案 0 :(得分:7)
简答: Java可以自动将int
和long
扩展到float
和double
,但Java会选择扩展到float
,因为它比double
更小(就内存占用而言)。您可以通过将参数显式转换为double
来调用方法的double
版本:
System.out.print(m((double)a1) + "," + m((double)b1));
长答案: Java中的每个原始数据类型都有一个大小(以字节为单位),它决定了多少信息(或更确切地说,值的范围)a给予原始可以持有。下表显示了Java的一些原始数据类型的大小:
byte 1 byte
short 2 bytes
char 2 bytes
int 4 bytes
float 4 bytes
long 8 bytes
double 8 bytes
在well-defined rules Java Language Specification之后,某些情况下,Java会自动为您“扩大”值。以下扩展的原始转换由Java自动执行:
byte
至short
,int
,long
,float
或double
short
至int
,long
,float
或double
char
至int
,long
,float
或double
int
至long
,float
或double
long
至float
或double
float
至double
适用于这种情况的其他规则是:
int
或long
值扩展为float
,或将long
值扩展为double
可能会导致丢失精度 例如,Java可以安全地将int
扩展为long
而根本不更改数值,因为两者都是整数类型且long
大于{{1} (见规则2)。 Java还可以将int
扩展为int
,但可能会丢失 precision 。下面的示例代码证明了这种精度损失。
float
对public static void foo(float f) {
System.out.println(f);
}
public static void main(String[] args) {
int a = 123;
int b = 1234567890;
foo(a);
foo(b);
}
的第一次调用按预期打印“123.0”。 foo(float)
值“123”被扩展为int
值“123.0”。第二个调用打印“1.23456794E9”,这在考虑规则3时是有意义的。值“1234567940”与的幅度相同,但 <12>真实地“1234567890”。
这里关键的另一条信息:当存在多个重载方法时,Java通过选择具有最小参数类型的方法(就内存占用而言)来确定调用哪个方法给定的参数能够扩展到参数类型。换句话说,传递给方法的数字必须能够扩展到方法的参数类型和,如果多个重载方法满足该要求,Java将选择参数类型为最小的。
在您的情况下,您将float
和int
传递给两个重载方法之一。 Java将查看方法long
和m(float)
以确定要调用的方法。 m(double)
可以扩展为int
和 a float
,但double
(4个字节)小于float
(8字节),因此Java将选择调用double
。使用m(float)
参数调用方法时也是如此:long
被选中,因为它是float
可以扩展为的最小数据类型。
答案 1 :(得分:4)
如果您想调用double
版本,请明确将其设为双倍:m((double)a1)
答案 2 :(得分:3)
尝试
System.out.print(m(1f)+","+ m(2d));
为什么要创建一个int并且要测试它?那么,实际发生的是默认情况下两个参数都转换为float。
答案 3 :(得分:1)
我该怎么称呼?
使用double
变量
double d = 3.3;
m(d);