为什么声明浮点变量时需要在十进制数末尾添加“f”?

2024-01-06

我以前见过这个问题。然而,我对给出的答案并不满意。典型的响应是 Java 将数字视为双精度数,因为这是 JAVA 中的默认值,并在编译时给出不匹配错误。

这种行为显然完全忽略了我对 float 声明的使用。

我的问题是:如果我将变量类型声明为float,为什么Java认为它是double?我特此声明:

float x = 3.14;

我已经通过使用 float 关键字告诉 Java 我希望这个变量是 float 类型。为什么需要这样做?

float x = 3.14f;

如果我想要一个 double 类型变量,我使用 double 关键字专门将该变量声明为 double。

double x = 3.14;

为什么 Java 在声明变量时无法识别这一点,并坚持需要通过在末尾添加“f”将文字从双精度型转换为浮点型? Java 不应该识别关键字的使用吗float并将类型正确分配给文字?


大小事项

32 位浮点数 →float x = 3.14 ;← 64 位双精度

Java 中小数数字文字的默认值是 64 位原语double类型,如图所示马克·罗特维尔的回答 https://stackoverflow.com/a/66158887/642706. 3.14 is a double, as is 3.14d and 3.14D.

原始的float类型更小,32位。

如果 Java 能够推断出你的意思said is a double但你什么meant is a float,Java 必须将 64 位值减少为 32 位值,丢弃一半数据,即 32 位。这可能涉及数据丢失对于更大的数字。这肯定意味着容量损失.

所以Java的设计者决定在这件事上保守一点。他们决定不随意丢弃一半的数据,也不将指定的容量减少一半。他们决定相信你的话——如果你说 64 位double,他们给你一个double.

如果您接着说要将 64 位数字塞入 32 位容器中,它们会标记错误,因为 64 位不适合 32 位。方钉,圆孔。

圆孔,32位浮点数 →float x = 3.14 ;← 64 位双、方钉

Java 确实支持相反的情况,即扩大转换。你可以放一个32位的float转换为 64 位double。你可以放一个32位的int转换为 64 位long。这些操作是安全的,因为额外的 32 位可以安全地用零填充。所以Java愿意并且能够支持这些操作。

明确

我建议你养成明确的习惯。不要依赖默认值。如果你指的是 32 位float,附加f or F按照你的字面意思。如果你指的是 64 位double,附加d or D按照你的字面意思。

这样做不仅可以让编译器安静下来,还可以让阅读代码的人清楚你的意图。

float pi = 3.14F ;
double pi = 3.14d ;

BigDecimal

顺便说一句,如果你关心准确性而非性能 https://en.m.wikipedia.org/wiki/Floating-point_arithmetic#Accuracy_problems,你将使用BigDecimal https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html而不是float/double。在这种情况下,这个问题就没有意义了。

BigDecimal pi = new BigDecimal( "3.14" ) ;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么声明浮点变量时需要在十进制数末尾添加“f”? 的相关文章

  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • Java 泛型/类型调度问题

    考虑以下程序 import java util List import java util ArrayList public class TypeTest public static class TypeTestA extends Type
  • Java 变量的作用域

    我不明白为什么这段代码的输出是10 package uno public class A int x 10 A int x 12 new B public static void main String args int x 11 new
  • 服务器到 Firebase HTTP POST 结果为响应消息 200

    使用 Java 代码 向下滚动查看 我使用 FCM 向我的 Android 发送通知消息 当提供正确的服务器密钥令牌时 我收到如下所示的响应消息 之后从 FCM 收到以下响应消息 Response 200 Success Message m
  • 所有junit测试后的清理

    在我的项目中 我必须在所有测试之前进行一些存储库设置 这是使用一些棘手的静态规则来完成的 然而 在所有测试之后我不知道如何进行清理 我不想保留一些神奇的静态数字来引用所有测试方法的数量 我应该一直维护它 最受赞赏的方法是添加一些侦听器 该侦
  • cucumber-junit-platform-engine 中的功能文件发现

    In cucumber junit我使用的库 CucumberOptions定义功能文件位置 package com mycompany cucumber import cucumber api CucumberOptions import
  • Java:VM 如何在 32 位处理器上处理 64 位“long”

    JVM 如何在 32 位处理器上处理 64 位的原始 long 在多核 32 位机器上可以并行利用多个核心吗 64 位操作在 32 位机器上慢了多少 它可能使用多个核心来运行不同的线程 但不会并行使用它们进行 64 位计算 64 位长基本上
  • Install4j:如何在安装结束时执行命令行 java -jar filename.jar

    在 Intall4j 中 在安装结束时 我只想通过执行如下命令行来初始化某些内容 java jar filename jar 我怎样才能归档这个任务install4j Thanks 将 运行可执行文件或批处理文件 操作添加到 安装屏幕 并设
  • 参数动态时如何构建 JPQL 查询?

    我想知道是否有一个好的解决方案来构建基于过滤器的 JPQL 查询 我的查询太 富有表现力 我无法使用 Criteria 就像是 query Select from Ent if parameter null query WHERE fiel
  • 具有多种值类型的 Java 枚举

    基本上我所做的是为国家编写一个枚举 我希望不仅能够像国家一样访问它们 而且还能够访问它们的缩写以及它们是否是原始殖民地 public enum States MASSACHUSETTS Massachusetts MA true MICHI
  • Apache Commons CLI:替代已弃用的 OptionBuilder?

    IntelliJ 显示此示例代码中不推荐使用 OptionBuilderhttp commons apache org proper commons cli usage html http commons apache org proper
  • 不兼容的类型:在 java netbeans 中对象无法转换为 String

    我试图在我的项目中使用对象数组 但出现错误 incompatible types Object cannot be converted to String 在这一行 ST1 new String emt1 emt2 emt3 emt4 现在
  • 将 RSA 密钥从 BigIntegers 转换为SubjectPublicKeyInfo 形式

    WARNING 最初的问题是关于 PKCS 1 编码密钥 而问题中的实际示例需要SubjectPublicKeyInfo X 509 编码密钥 我目前正致力于在 java 中从头开始实现 RSA 算法 特别是密钥生成方面 现在我的代码可以给
  • 在 Selenium WebDriver 上如何从 Span 标签获取文本

    在 Selenium Webdriver 上 如何从 span 标记检索文本并打印 我需要提取文本UPS Overnight Free HTML代码如下 div id customSelect 3 class select wrapper
  • 阻止 OSX 变音符号为所有用户禁用 Java 中的 KeyBindings?

    注 我知道这个问题 https stackoverflow com questions 40335285 java keybinds stop working after holding down a key用户必须输入终端命令才能解决此问
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或
  • 从一个文本文件中获取数据并将其移动到新的文本文件

    我有一个文件 里面有数据 在我的主要方法中 我读入文件并关闭文件 我调用另一种方法 在原始文件的同一文件夹内创建一个新文件 所以现在我有两个文件 原始文件和通过我调用的方法生成的文件 我需要另一种方法 从原始文件中获取数据并将其写入创建的新
  • Java 编码风格、局部变量与重复方法调用

    我更喜欢使用局部变量而不是多次调用同一方法 I prefer this Vehicle vehicle person getVehicle if vehicle instanceof Car Car car Car vehicle car
  • Java 推断泛型类型

    我正在寻找类似的推断捕获泛型类型的概念 类似于以下方法片段 但不是捕获泛型类型的类 public

随机推荐