在 Java 中表示浮点值

Representing float values in Java(在 Java 中表示浮点值)
本文介绍了在 Java 中表示浮点值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

看下面的三行代码.

  float f = 1;

  float g = 1.1;

  float h = 1.1f;

第二行有编译错误,而其他行没有编译错误.第一行在没有后缀 f 的情况下工作正常,第三行在后缀 f 下工作.这是为什么呢?

Second line has compilation errors, while the other lines do not have compilation errors. First line is working fine without suffix f and third line is working with suffix f. Why is this?

推荐答案

Java 中的浮点字面量默认是 double 值.

Floating point literals in Java is a double value by default.

如果浮点文字以 ASCII 字母 Ff 为后缀,则为 float 类型;否则它的类型是 double 并且可以选择以 ASCII 字母 Dd 为后缀.

JLS 3.10.2 Floating-Point Literals

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.

如果没有明确的缩小转换,您不能将 double 值分配给 float.因此,您有两种选择:

You can't assign a double value to a float without an explicit narrowing conversion. You therefore have two options:

  • 对于文字,使用后缀 fF 来表示 float
  • 对于非文字,使用显式转换 (float)
  • For literals, use the suffix f or F to denote a float value
  • For non-literals, use an explicit cast (float)

后者的一个例子是:

double d = 1.1;
float f = (float) d; // compiles fine!


关于扩大转化率

这样编译的原因:


On widening conversions

The reason why this compiles:

float f = 1;

是因为从 intfloat 的扩大转换可以在赋值的上下文中隐式完成.

is because the widening conversion from int to float can be done implicitly in the context of an assignment.

赋值转换发生在将表达式的值赋值给变量时:必须将表达式的类型转换为变量的类型.赋值上下文允许使用以下之一:

JLS 5.2 Assignment Conversion

Assignment conversion occurs when the value of an expression is assigned to a variable: the type of the expression must be converted to the type of the variable. Assignment contexts allow the use of one of the following:

  • 扩大的原始转换(§5.1.2)
  • [...]

以下 19 种基本类型的特定转换称为加宽基本类型转换:

The following 19 specific conversions on primitive types are called the widening primitive conversions:

  • intlongfloatdouble
  • [...]


文字的其他数据类型后缀

如上所述,double 也有 Dd 后缀.以这个片段为例:


Other data type suffix for literals

As mentioned above, there's also the D or d suffix for double. Consider this snippet for example:

static void f(int i) {
    System.out.println("(int)");
}
static void f(double d) {
    System.out.println("(double)");
}

//...
f(1);   // prints "(int)"
f(1D);  // prints "(double)"

long 文字还有一个后缀,即 Ll(小写字母).强烈建议您使用大写变体.

There's also a suffix for long literals, which is L or l (lowercase letter). It is highly recommended that you use the uppercase variant.

如果整数文字以 ASCII 字母 Ll (elllong>);否则它是 int 类型.后缀 L 是首选,因为字母 l (ell) 通常很难与数字 1 区分开来(一个).

JLS 3.10.1 Integer Literals

An integer literal is of type long if it is suffixed with an ASCII letter L or l (ell); otherwise it is of type int. The suffix L is preferred, because the letter l (ell) is often hard to distinguish from the digit 1 (one).

这篇关于在 Java 中表示浮点值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How to send data to COM PORT using JAVA?(如何使用 JAVA 向 COM PORT 发送数据?)
How to make a report page direction to change to quot;rtlquot;?(如何使报表页面方向更改为“rtl?)
Use cyrillic .properties file in eclipse project(在 Eclipse 项目中使用西里尔文 .properties 文件)
Is there any way to detect an RTL language in Java?(有没有办法在 Java 中检测 RTL 语言?)
How to load resource bundle messages from DB in Java?(如何在 Java 中从 DB 加载资源包消息?)
How do I change the default locale settings in Java to make them consistent?(如何更改 Java 中的默认语言环境设置以使其保持一致?)