Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的short、int、long、double和float之间的转换_Java_Types_Casting_Int_Double - Fatal编程技术网

Java中的short、int、long、double和float之间的转换

Java中的short、int、long、double和float之间的转换,java,types,casting,int,double,Java,Types,Casting,Int,Double,据我所知,当您使用Java中的算术运算在这两种类型之间进行转换时,例如double+int,结果将是更大的类型(在本例中,这意味着结果将是double)。对两种大小相同的类型进行算术运算时会发生什么情况?int+float和long+double将给出什么?因为int和float分别是4个字节,long和double是8个字节 int+float将为您提供float(请注意,您必须将结果强制转换为float,因为默认情况下使用了double)long+double将为您提供double这都是由J

据我所知,当您使用Java中的算术运算在这两种类型之间进行转换时,例如double+int,结果将是更大的类型(在本例中,这意味着结果将是double)。对两种大小相同的类型进行算术运算时会发生什么情况?int+float和long+double将给出什么?因为int和float分别是4个字节,long和double是8个字节

int
+
float
将为您提供
float
(请注意,您必须将结果强制转换为
float
,因为默认情况下使用了
double
long
+
double
将为您提供
double

这都是由JLS中的二进制数字升级规则指定的。发件人:

当运算符将二进制数字提升应用于一对 操作数,每个操作数必须表示可转换为 数字类型,按顺序应用以下规则:

  • 如果任何操作数属于引用类型,则将对其进行取消装箱 转换(§5.1.8)

  • 加宽原语转换(§5.1.2)用于转换或 由以下规则指定的两个操作数:

    • 如果其中一个操作数的类型为double,则另一个操作数将转换为double

    • 否则,如果其中一个操作数为float类型,则转换另一个操作数 漂浮

    • 否则,如果其中一个操作数的类型为long,则转换另一个操作数 太久了

    • 否则,两个操作数都将转换为int类型

  • 在类型转换(如有)后,值集转换(§5.1.13)被取消 应用于每个操作数

    对某些运算符的操作数执行二进制数字提升:

    • 乘法运算符*、/和%(§15.17)

    • 数字类型的加减运算符+和- (§15.18.2)

    • 数值比较运算符=(§15.20.1)

    • 数值相等运算符==和!=(§15.21.1)

    • 整数位运算符&、^和|(§15.22.1)

    • 在某些情况下,条件运算符?:(§15.25)


    (“值集转换”是关于浮点表示之间的映射。)

    仍将返回可以保存整个值的
    “biger”
    类型。在你的具体问题中

    如果在int和float之间加上+,则返回值将是float
    long+double返回一个double,

    加法运算符
    +
    -
    的行为在JLS的中定义。它声明它首先执行二进制数字升级:

    对操作数执行二进制数字提升

    这依次由定义。实质上,对于原语:

    • 如果其中一个操作数的类型为double,则另一个操作数将转换为double
    • 否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float
    • 否则,如果其中一个操作数的类型为long,则另一个操作数将转换为long
    • 否则,两个操作数都将转换为int类型

    关于类型转换有两个有趣的常见问题,可在以下网站找到:

    回答两种大小相同的类型的问题时,返回值是精度最高的类型

    请尝试以下代码:

    public static void main(String[] args) {
        int i=1;
        float f=2.5f;
        long l=10;
        double d=3.74;
        System.out.println(i+f);
        System.out.println(f+i);
        System.out.println(l+d);
        System.out.println(d+l);
    }
    
    您将看到结果是3.5和13.74,分别是浮点和双精度(在Netbeans 6.9和java 1.6中测试)。

    这种“提升”的一个窍门是
    long
    +
    float
    将“扩展”到使用浮点

    e、 g

    印刷品

    1.11111113E18
    1.11111111111111117E18
    

    在处理long和float时,您可能无法获得比预期更宽的类型,并且可能会损失更高的精度。

    IMHO,Java应该禁止与许多运算符进行类型组合,允许在大多数情况下从
    double
    隐式转换为
    float
    ,其中目标类型显然是
    float
    ,由于这种转换几乎总是会产生预期的行为,并且不允许从
    float
    double
    的隐式转换,因为这种转换通常是错误的(例如
    double OneTenth=1.0f/10.0f;
    应该对IMHO发出尖叫,但不会)。如果生成的
    float
    不能直接与其他类型交互,我不介意从
    long
    隐式转换为
    float
    。@supercat我同意,但另一种方法是
    double
    更精确,这就是为什么从float转换为double是可以的。(您可以无损失地转换回)如果将double转换为float并再次转换回,则可能会丢失精度,这就是为什么它不安全的原因。一般来说,我会避免使用float,因为它在99%的情况下都没有用处;我刚刚在上写了一篇博客,希望得到你的反馈。对我来说,最重要的一点是,如果
    t
    是某个抽象量x的类型
    t
    的最佳表示,并且存在从
    t
    U
    的隐式转换,那么
    (U)t
    应该是该x的最佳表示之一。另一个是,对于类型和值的任何组合,
    (U)t==t
    不应返回false。要么…@我同意
    (双精度)0.1f==0.1f
    为真
    (float)0.1==0.1
    为false。您想在我的博客或聊天中讨论此问题吗?我想听听你对我在那里写的东西的反馈。至于您的场景,如果我正在编写规则,并且不能使
    长a=b*c相当于
    长a=(长)b*c
    我会让语言需要一个typecast到
    int
    (例如
    long a=(int)(b*c);
    ,例如通过一个属性禁止其
    1.11111113E18
    1.11111111111111117E18