栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

声明浮点数,为什么默认类型为double?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

声明浮点数,为什么默认类型为double?

为什么默认类型是双精度型?

Java语言的设计者最好问这个问题。他们是唯一知道做出语言设计决定的 真正 原因的人。但我希望推理遵循以下几条原则:

他们需要区分两种类型的文字,因为从数学的角度来看,它们实际上的含义是不同的值。

假设他们将“ float”作为文字的默认值,请考虑以下示例

// (Hypothetical "java" pre ... )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.5
has类型
double
(将
int
转换为
double
),因此最终调用
Math.Round(double)

通常,Java算术将隐式地将数字类型从“较小”​​转换为“较大”,而不是从“较大”转换为“较小”。

但是,您仍然需要小心,因为(在您的取整示例中):

  • 整数和浮点数的乘积可能无法以足够的精度表示,因为(例如)a

    float
    的精度比a 的精度低
    int

  • 将结果

    Math.round(double)
    转换为整数类型可导致转换为整数类型的最小/最大值。

但是所有这些都说明了编程语言中的算术支持是棘手的,对于一个新手或粗心的程序员来说,不可避免地会遇到一些麻烦。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/369018.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号