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

浮动内容的Java解释器的默认数据类型,java,floating-point,interpreter,Java,Floating Point,Interpreter,对所有人来说,这可能是一个简单的问题,但一个问题“为什么会这样?”让我的头脑混乱 正如您在下面的代码中所看到的,我声明了一个float变量并为其赋值。当编译和解释这段代码时,我将得到一个错误,即可能的精度损失,这是正确的,因为浮点常量的java解释器的默认数据类型是double 查询1:我想知道,当我的浮点常量可以容纳浮点提供的字节数时,为什么我要在应用程序中浪费内存来实现double 查询2:现在,如果我指定float a=3.1415f我将获得输出,但现在为变量分配了多少内存 float a

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

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

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

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

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

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

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

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

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


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

这只是一个浮点文本默认为
double
的问题。发件人:

如果浮点文字的后缀为ASCII字母F或F,则它的类型为float;否则,其类型为双精度,并且可以选择使用ASCII字母D或D作为后缀(§4.2.3)

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

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

下一步:

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

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

4字节,因为它是规范中定义的
浮点值,所以浮点值是32位IEEE 754值,因此它消耗4字节。本文档解释了默认设置和推理:。Sun/Oracle的建议是,如果不需要double的精度,并且内存是一个问题,请像您所做的那样使用float。

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

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

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


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

让我用一个问题来回答:

为什么这段代码打印的是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;但它并没有评估每个数字是否“适合”漂浮状态,或者是否需要一个双精度的数字而不损失精度。。。它只是假设绝大多数人的精度会降低,这是正确的。

这个答案没有说明用户在说“当我的浮动常量可以容纳浮动提供的字节数时”时犯下的巨大错误。显然,他的问题的根源在于错误地认为十进制3.1415可以用浮点或双精度表示。我很想投反对票。计算机在底层以二进制方式工作,该死的泄漏抽象法则:@Daren:Edited。(虽然浮点/双精度不是唯一的浮点表示法,当然。3.1415是用浮点小数类型表示的。)@JonSkeet我并不怀疑你令人印象深刻的知识,我希望我有一点你的专业知识…:)我只是认为询问者在纠正了外层推理后离开了,但没有看到他真正的错误。一颗好奇的心,他不得不在如此琐碎的事情上问为什么,但可能在不知道真正原因的情况下离开了。。。这不仅仅是一个编译器惯例。检查帕特里夏·沙纳汉的答案!错误的核心在于“我的浮点常量可以容纳浮点提供的字节数”您的常量既不能容纳为浮点也不能容纳为双精度!这就是发生精度损失的原因,您必须输入“f”,以便编译器尽可能接近它。