有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

浮动内容的Java解释器的默认数据类型

对所有人来说,这可能是一个简单的问题,但一个问题“为什么会这样?”让我的头脑混乱

正如您在下面的代码中所看到的,我声明了一个float变量并为其赋值。当编译和解释这段代码时,我将得到一个错误possible loss of precision,这是正确的,因为浮点常量的java解释器的默认数据类型是double

查询1:我想知道,当我的浮点常量可以容纳浮点提供的字节数时,为什么我要在应用程序中浪费内存来实现double

查询2:现在如果我指定float a = 3.1415f ;,我将获得输出,但是现在为我的a变量分配了多少内存

float a = 3.1415 ;
System.out.println("Value of a:"+a);

我真的很想了解这个黑客,为什么会这样


共 (5) 个答案

  1. # 1 楼答案

    让我回答一个问题:

    为什么这段代码打印的是false而不是true

    float a = 3.1415;
    double b = 3.1415;
    double c = a;
    System.out.println((b==c));
    

    。。。知道了?没错

    然而,这并不是全部逻辑,因为0.1f和0.1在二进制表示中是不同的数字,但是0.5f和0.5是相同的,编译器应该允许您声明float f=0.5;但它并没有评估每个数字是否“适合”漂浮状态,或者是否需要一个双精度的数字而不损失精度。。。它只是假设绝大多数人将失去精度,这是正确的

  2. # 2 楼答案

    问题1:我想知道,当我的浮点常量可以容纳浮点提供的字节数时,我为什么要在我的应用程序中浪费内存来实现double呢

    这包含了一个错误的假设。float和double都不能真正存储您的价值:

    float: 3.141499996185302734375
    double: 3.141500000000000181188397618825547397136688232421875
    

    两者都是近似值,但double比float更接近近似值

    如果您不打算考虑文字所需的精度,那么使用double更安全,因此它是适当的默认值。如果您已经分析了浮点舍入误差的影响,并且确定浮点是可以接受的,那么您可以并且应该将其设置为浮点文字

  3. # 3 楼答案

    问题1:因为浮点计算几乎总是涉及近似值double类型的精度(双精度)比float高,因此它减少了由于近似而丢失任何数据的机会。我认为这可能是将任何浮点文本视为双精度文本的一个原因

    查询2:对于这两种情况,您的a变量的大小都是32位(请在此处签出the float section)。在—

    float a = 3.1414;
    

    语句中,该值被转换为浮点,这称为缩小转换。Java不允许这样做,但它允许相反的转换

  4. # 5 楼答案

    Query 1 : I wonder, why should I waste memory in my application for double when my floating constant can accommodate in number of bytes float provide.

    这只是一个浮点文本默认为double的问题。从section 3.10.2 of the JLS

    A floating-point literal is of type float if it is suffixed with an ASCII letter F or f; otherwise its type is double and it can optionally be suffixed with an ASCII letter D or d (§4.2.3).

    您需要决定需要哪种类型,并编写适当的文本。几乎可以肯定的是,您不应该根据指定的位数来选择数据类型,并且要注意,仅仅因为float可以保持一定数量的小数位数的准确性,并不意味着它可以准确地表示具有如此多有效位数的数字。例如,没有二进制浮点类型可以精确地表示0.1,就像不能将“三分之一”写成有限的十进制数一样

    作为旁注,我个人喜欢为double明确地添加d,只是为了清楚起见

    下一步:

    Query 2: Now if I specify float a = 3.1415f ; I will get the output but now how much memory is allocated for my a variable.

    4字节,因为它是一个float