关于长期和浮动

时间:2012-04-29 05:39:03

标签: java

我正在开发以下代码

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));
}

两者都导致输出浮动,浮动,请问建议的原因是什么,如何打电话给双,请多多指教。

4 个答案:

答案 0 :(得分:7)

简答: Java可以自动将intlong扩展到floatdouble,但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自动执行:

  • byteshortintlongfloatdouble
  • shortintlongfloatdouble
  • charintlongfloatdouble
  • intlongfloatdouble
  • longfloatdouble
  • floatdouble

适用于这种情况的其他规则是:

  1. 扩展不会丢失有关数值的整体幅度的信息。
  2. 从整数类型扩展到另一种整数类型不会丢失任何信息;数值完全保留。
  3. intlong值扩展为float,或将long值扩展为double可能会导致丢失精度
  4. 例如,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将选择参数类型为最小的。

    在您的情况下,您将floatint传递给两个重载方法之一。 Java将查看方法longm(float)以确定要调用的方法。 m(double)可以扩展为int a float,但double(4个字节)小于float (8字节),因此Java将选择调用double。使用m(float)参数调用方法时也是如此:long被选中,因为它是float可以扩展为的最小数据类型。

答案 1 :(得分:4)

如果您想调用double版本,请明确将其设为双倍:m((double)a1)

查看JLS §8.4.9 - Method Overloading

答案 2 :(得分:3)

尝试

    System.out.print(m(1f)+","+ m(2d));

为什么要创建一个int并且要测试它?那么,实际发生的是默认情况下两个参数都转换为float。

答案 3 :(得分:1)

  

我该怎么称呼?

使用double变量

double d = 3.3;
m(d);