首页 > 编程语言 >Java核心技术卷1 第三章选读

Java核心技术卷1 第三章选读

时间:2024-12-16 10:20:15浏览次数:4  
标签:选读 第三章 Double NaN 操作数 数值 double 类型 Java

前言

本文内容选自Java核心技术卷1 第10版,感兴趣的小伙伴可以自行阅读原书,以下内容为本人学习后摘取的片段与大家分享。

正文

3.3.2 浮点类型
所有的浮点数值计算都遵循 IEEE 754 规范。具体来说,下面是用于表示溢出和出错情况的三个特殊的浮点数值:

  • 正无穷大
  • 负无穷大
  • NaN (不是一个数字)

例如,一正整数除以 0 的结果为正无穷大。计算 0/0 或者负数的平方根结果为 NaN。

常量 Double_POSITIVE_INFINITY、 Double.NEGATIVEJNFINITY 和 Double.NaN ( 以及相应的 Float 类型的常量) 分别表示这三个特殊的值, 但在实际应用中很少遇到。
特别要说明的是, 不能这样检测一个特定值是否等于 Double.NaN:

if (x == Double.NaN) // is never true

所有“ 非数值” 的值都认为是不相同的。然而,可以使用 Double.isNaN 方法:

if (Double.isNaN(x)) // check whether x is "not a number"

警告: 浮点数值不适用于无法接受舍入误差的金融计算中。 例如,命令

System.out.println(2.0 - 1.1)

将打印出 0.8999999999999999, 而不是人们想象的 0.9。这种舍入误差的主要原因是浮点数值采用二进制系统表示, 而在二进制系统中无法精确地表示分数 1/10。这就好像十进制无法精确地表示分数 1/3 一样。如果在数值计算中不允许有任何舍入误差,就应该使用 BigDecimal 类。

并且,NaN类型也不等于自己,尝试运行以下代码:

System.out.println(Double.NaN == Double.NaN); // is false

3.5.1 数学函数与常量

在 Math类中,包含了各种各样的数学函数。在编写不同类别的程序时,可能需要的函数也不同。
要想计算一个数值的平方根, 可以使用 sqrt 方法:

double x = 4;
double y = Math.sqrt(x);
System.out.println(y); // prints 2.0

注释: println 方法和 sqrt 方法存在微小的差异。println 方法处理 System.out 对象。但是,Math 类中的 sqrt 方法处理的不是对象,这样的方法被称为静态方法。
在 Java中,没有幂运算, 因此需要借助于 Math 类的 pow 方法。语句:

double y = Math.pow(x, a);

将 y 的值设置为 x 的 a 次幂( xa)。pow 方法有两个 double 类型的参数, 其返回结果也为double 类型。

floorMod 方法的目的是解决一个长期存在的有关整数余数的问题。考虑表达式 n % 2。所有人都知道, 如果 n 是偶数, 这个表达式为 0 ; 如果 n 是奇数, 表达式则为 1。当然, 除非 n 是负数 如果 n 为负,这个表达式则为 -1。为什么呢? 设计最早的计算机时,必须有人制定规则,明确整数除法和求余对负数操作数该如何处理。数学家们几百年来都知道这样一个最优(或“ 欧几里德”)规则:余数总是要 ≥0。不过, 最早制定规则的人并没有翻开数学书好好研究,而是提出了一些看似合理但实际上很不方便的规则。

下面考虑这样一个问题: 计算一个时钟时针的位置。这里要做一个时间调整, 而且要归一化为一个 0 ~ 11 之间的数。 这很简单:(position + adjustment) % 12。不过, 如果这个调整为负会怎么样呢? 你可能会得到一个负数。所以要引入一个分支, 或者使用((position + adjustment) % 12 + 12) % 12。不管怎样, 总之都很麻烦。
floorMod 方法就让这个问题变得容易了:floorMod(position + adjustment, 12) 总会得到一个 0 ~ 11 之间的数。
(遗憾的是,对于负除数,floorMod 会得到负数结果,不过这种情况在实际中很少出现。)

3.5.2 数值类型之间的转换

经常需要将一种数值类型转换为另一种数值类型。图 3-1 给出了数值类型之间的合法转换。
在图 3-1 中有 6 个实心箭头,表示无信息丢失的转换;有 3 个虚箭头, 表示可能有精度损失的转换。 例如,123 456 789 是一个大整数, 它所包含的位数比 float 类型所能够表达的位数多。 当将这个整型数值转换为 float 类型时, 将会得到同样大小的结果,但却失去了一定的精度。

int n = 123456789;
float f = n; // f is 1.23456792E8

当使用上面两个数值进行二元操作时(例如 n + f,n 是整数, f 是浮点数,) 先要将两个操作数转换为同一种类型,然后再进行计算。

  • 如果两个操作数中有一个是 double 类型, 另一个操作数就会转换为 double 类型。
  • 否则,如果其中一个操作数是 float 类型,另一个操作数将会转换为 float 类型。
  • 否则, 如果其中一个操作数是 long 类型, 另一个操作数将会转换为 long 类型。
  • 否则, 两个操作数都将被转换为 int 类型。

标签:选读,第三章,Double,NaN,操作数,数值,double,类型,Java
From: https://www.cnblogs.com/jwcat313/p/18609311

相关文章

  • javascript中 import 路径
    import路径import{test}from'./test';花括号import{test}from'./test';importtestfrom'./test';如果有默认导出exportdefault则可以省略花括号,且import的模块名是随意的,如://a.jsexportdefault'test';//b.jsimportafrom'./......
  • 【数据结构与算法】Java描述:JDK17新增常用特性
    前言:从springboot3.0开始,已经不支持JDK8了。参考资料,来自官方博客:https://spring.io/blog/2022/01/20/spring-boot-3-0-0-m1-is-nowavailable?spm=a2c6h.12873639.article-detail.24.766d46b40LM1IV从3.0开始,转变为JDK17。JDK17是LTS(长期支持版),可以免费商用到2029......
  • Easysearch Java SDK 2.0.x 使用指南(一)
    各位Easysearch的小伙伴们,我们前一阵刚把easysearch-client更新到了2.0.2版本!借此详细介绍下新版客户端的使用。新版客户端和1.0版本相比,完全重构,抛弃了旧版客户端的一些历史包袱,从里到外都焕然一新!不管是刚入门的小白还是经验丰富的老司机,2.0.x客户端都能让你开发效率......
  • Java 密封类 (Sealed Classes) 深度解析
    文章目录语法说明定义密封类定义子类使用场景探讨实际应用示例与其他语言特性的结合使用Java作为一种面向对象编程语言,提供了继承机制来实现代码复用和扩展。然而,无限制的继承可能导致代码库变得难以维护,甚至引入安全隐患。为了应对这一挑战,Java引入了密封类的概......
  • Day32-JavaEE应用&Servlet路由技术&UDBC&Mybatis数据库&生命周期
    一,Servlet&路由&周期1,Servlet的含义:Servlet是运行在web服务器或应用服务器上的程序,它是作为来自web浏览器或其他HTTP客户端请求和HTTP服务器上的数据库或应用程序的中间件。使用Servlet可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页2.Servl......
  • JavaScript是按顺序执行的吗?聊聊JavaScript中的变量提升
    作为一位前端开发者,我们经常会听到这么一句话:“JavaScript的执行是按照顺序自上而下依次执行的。”这句话说的并没有错。但是它似乎又好像不完全对。我们先来看以下这段代码。你觉得结果会输出什么?1showName()2console.log(myName)34varmyName='修谦'5functionshow......
  • 从零开始搭建基于 Maven 和 MyBatis 的 Java 项目
    从零开始搭建基于Maven和MyBatis的Java项目1.修改IDEA中Maven的配置(安转目录本地仓库)2.创建Maven工程3.修改pom.xml文件中的配置信息主要是Maven编译器插件(maven-compiler-plugin)4.导入相关依赖坐标5.创建pojoJavaBean书写实体类6.根据实体类编写SQL语句建......
  • node.js毕设基于Java的心理咨询预约系统 论文+程序
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于心理咨询预约系统的研究,现有研究主要以通用的预约系统或医院的预约系统为主[2] 。专门针对高校等特定场景基于Java的心理咨询预约系统的研究较少。......
  • 【Python应用】Jep:将Python无缝嵌入到Java应用程序中,充分发挥两种语言的潜力
    Python以其简洁的语法和丰富的库而闻名,而Java则以其性能和稳定性著称。如果能将两者的优势结合起来,将会产生巨大的开发效率提升。Jep(JavaEmbeddedPython)正是这样一个桥梁,它允许你将CPython无缝嵌入到Java应用程序中,从而充分发挥两种语言的潜力。Jep的核心功能:无缝衔接Java......
  • web前端期末大作业:基于HTML+CSS+JavaScript制作我的音乐网站(带设计报告)
    ......