声明浮点数,为什么默认类型为double?
我很好奇为什么必须这样声明float文字:
float f = 0.1f;
代替
float f = 0.1;
为什么默认类型是双精度类型,为什么编译器不能通过查看赋值的左侧来推断它是浮点型的?Google仅提供关于默认值的解释,而不是为什么如此。
回答:
为什么默认类型是双精度型?
Java语言的设计者最好问这个问题。他们是唯一知道做出语言设计决定的 真正 原因的人。但我希望推理遵循以下几条原则:
他们需要区分两种类型的文字,因为从数学的角度来看,它们实际上的含义是不同的值。
假设他们将“ float”作为文字的默认值,请考虑以下示例
// (Hypothetical "java" code ... )double d = 0.1;
double d2 = 0.1d;
在上面,d
和d2
实际上将具有不同的值。在第一种情况下,将低float
精度double
值在分配点转换为较高精度值。但是您无法恢复不存在的精度。
我 认为 ,这两个语句都合法且含义不同的语言设计是一个错误的想法……考虑到第一个语句的实际含义与“自然”含义不同。
通过按照他们的方式来做:
double d = 0.1f;double d2 = 0.1;
既合法又意味着不同的事情。但是在第一个语句中,程序员的意图很明确,而第二个语句的“自然”含义就是程序员得到的。在这种情况下:
float f = 0.1f;float f2 = 0.1; // compilation error!
…编译器发现不匹配。
我猜测使用浮点数是例外,而不是现代硬件的规则(使用双精度代替),因此在某些时候可以假设用户在编写时打算使用0.1f
float f = 0.1;
他们已经 可以
做到这一点。但是问题在于提出了一组有效的类型转换规则,这些规则非常简单,您不需要Java学的学位就能真正理解。0.1
在不同的背景下具有不同的意思会令人困惑。考虑一下:
void method(float f) { ... }void method(double d) { ... }
// Which overload is called in the following?
this.method(1.0);
编程语言设计很棘手。一个领域的改变可能对其他领域产生影响。
以解决@supercat提出的一些问题。
@supercat:鉴于上述重载,将为method(16777217)调用哪个方法?那是最好的选择吗?
我错误地评论了…编译错误。实际上答案是method(float)
。
JLS这样说:
15.12.2.5。选择最具体的方法
如果可以访问多个成员方法并将其应用于方法调用,则必须选择一个成员方法来为运行时方法分派提供描述符。Java编程语言使用选择最具体方法的规则。
…
[符号m1和m2表示适用的方法。]
[如果] m2不是通用的,并且m1和m2可通过 严格 或 宽松调用来应用
,并且其中m1具有形式参数类型S1,…,Sn,而m2具有形式参数类型T1,…,Tn,则该类型对于所有i(1≤i≤n,n =
k),对于参数ei,Si比Ti更具体。
…
以上条件是一种方法可能比另一种方法更具体的唯一情况。
如果S <:T(第4.10节),则对于任何表达式,类型S都比类型T更具体。
在这种情况下,我们是在比较method(float)
和method(double)
它们都是适用于呼叫。由于float
<:,double
它
更具体 ,因此method(float)
将被选择。
@supercat:如果例如这样的表达式被
int2 = (int) Math.Round(int1 * 3.5)
或long2 =
Math.Round(long1 * 3.5)替换为
int1 = (int) Math.Round(int2 * 3)
或long2 =
Math.Round(long1 * 3)
所做的更改看起来无害,但前两个表达式直到
613566756
或为止都是正确的,后两个表达式2573485501354568
在5592405
[上面完全失败]失败
715827882
。
如果您正在谈论做出改变的人,那么是的。
但是,编译器不会在后面进行任何更改。例如,int1 *
3.5has类型double
(将int
转换为double
),因此最终调用Math.Round(double)
。
通常,Java算术将隐式地将数字类型从“较小”转换为“较大”,而不是从“较大”转换为“较小”。
但是,您仍然需要小心,因为(在您的取整示例中):
整数和浮点数的乘积可能无法以足够的精度表示,因为(例如)a
float
的精度比a 的精度低int
。将结果
Math.round(double)
转换为整数类型可导致转换为整数类型的最小/最大值。
但是所有这些都说明了编程语言中的算术支持是棘手的,对于一个新手或粗心的程序员来说,不可避免地会遇到一些麻烦。
以上是 声明浮点数,为什么默认类型为double? 的全部内容, 来源链接: utcz.com/qa/419290.html