Java 每日一刊(第7期):浮点数运算

【OJ每日一练】1188 - 输出保留12位小数的浮点数 文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习。读入一个双精度浮点数,保留12位小数,输出这个浮点数。也只有一行,保留12位小数的浮点数。只有一行,一个双精度浮点数。 阅读详情


“计算机程序的错误通常在于数值近似。”

前言

这里是分享 Java 相关内容的专刊,每日一更。

本期将为大家带来以下内容:

  1. Java 的浮点数类型
  2. 基本的浮点数运算符
  3. 浮点数除法与取模
  4. 自增与自减运算
  5. 浮点数的科学计数法表示
  6. 浮点数的精度问题
  7. 解决浮点数精度问题
  8. 浮点数溢出问题
  9. 类型自动提升(Type Promotion)
  10. 强制类型转换(Type Casting)

Java 的浮点数类型

Java 是一种强类型语言,变量在声明时必须指定类型。对于浮点数运算,Java 提供了以下几种基本数据类型:

类型大小精度(有效位数)最小值最大值
float4 字节大约 7 位有效数字 1.4 × 1 0 − 45 1.4 \times 10^{-45} 1.4×10−45 3.4 × 1 0 38 3.4 \times 10^{38} 3.4×1038
double8 字节大约 15 位有效数字 4.9 × 1 0 − 324 4.9 \times 10^{-324} 4.9×10−324 1.7 × 1 0 308 1.7 \times 10^{308} 1.7×10308
  • float:单精度浮点数,使用 32 位来存储,适合对内存要求较高或精度要求较低的场景。
  • double:双精度浮点数,使用 64 位来存储,是 Java 中的默认浮点数类型,适用于大多数科学计算和高精度运算。

通常,Java 默认将小数类型识别为 double。如果需要定义 float 类型的数值,必须在数值后加上 f 或 F 后缀。

基本的浮点数运算符

Java 中的基本整数运算符与其他主流编程语言类似,支持的操作包括加、减、乘、除等。以下是 Java 支持的整数运算符:

  • + :加法
  • - :减法
  • * :乘法
  • / :除法
  • % :取模(求余)
double a = 5.7;
double b = 2.3;

System.out.println("加法: " + (a + b));  // 输出: 8.0
System.out.println("减法: " + (a - b));  // 输出: 3.4
System.out.println("乘法: " + (a * b));  // 输出: 13.11
System.out.println("除法: " + (a / b));  // 输出: 2.4782608695652173
System.out.println("取模: " + (a % b));  // 输出: 1.1000000000000005

浮点数除法与取模

浮点数除法不同于整数除法,它会保留小数部分。例如,10.0 / 3.0 的结果为 3.3333333333333335。取模运算同样适用于浮点数,返回的是除法后的余数。

double result = 10.0 / 3.0;     // 结果是 3.3333333333333335
double remainder = 10.0 % 3.0;  // 余数是 1.0

自增与自减运算

Java 同样支持对浮点数的自增(++)和自减(--)操作。与整数类型类似,浮点数的自增自减操作也有前置与后置之分:

  • 前置:先增加/减少,再返回值。
  • 后置:先返回值,再增加/减少。
double a = 1.5;
double b = ++a;  // 先将 a 加 1(a 变为 2.5),然后将结果赋值给 b,所以 b 的值为 2.5
System.out.println("前置自增后的 a: " + a);  // 输出: 2.5
System.out.println("前置自增后的 b: " + b);  // 输出: 2.5

double c = 1.5;
double d = c++;  // 先将 c 的当前值(1.5)赋给 d,然后再将 c 加 1(c 变为 2.5)
System.out.println("后置自增后的 c: " + c);  // 输出: 2.5
System.out.println("后置自增后的 d: " + d);  // 输出: 1.5

double e = 2.5;
double f = --e;  // 先将 e 减 1(e 变为 1.5),然后将结果赋值给 f,所以 f 的值为 1.5
System.out.println("前置自减后的 e: " + e);  // 输出: 1.5
System.out.println("前置自减后的 f: " + f);  // 输出: 1.5

double g = 2.5;
double h = g--;  // 先将 g 的当前值(2.5)赋给 h,然后再将 g 减 1(g 变为 1.5)
System.out.println("后置自减后的 g: " + g);  // 输出: 1.5
System.out.println("后置自减后的 h: " + h);  // 输出: 2.5

浮点数的科学计数法表示

Java 支持用科学计数法表示浮点数,尤其适合表示非常大的或非常小的数。例如,1.23e10 代表 1.23 × 1 0 10 1.23 \times 10^{10} 1.23×1010,1.23e-10 代表 1.23 × 1 0 − 10 1.23 \times 10^{-10} 1.23×10−10。

double large = 1.23e10;  // 1.23 * 10^10
double small = 1.23e-10; // 1.23 * 10^-10

System.out.println("large = " + large);  // 输出: 1.23E10
System.out.println("small = " + small);  // 输出: 1.23E-10

浮点数的精度问题

浮点数的精度是一个常见问题,尤其是在处理非常小的数或无法精确表示的数时(如 0.1 和 0.2)。由于浮点数是以二进制表示的,因此某些十进制的小数在浮点数中无法精确表示,可能会导致精度丢失。

double a = 0.1;
double b = 0.2;
System.out.println("0.1 + 0.2 = " + (a + b));  // 输出: 0.30000000000000004

解决浮点数精度问题

在一些对精度要求很高的场景中(如金融计算),可以使用 BigDecimal 类来避免浮点数的精度问题。

BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
System.out.println("0.1 + 0.2 = " + a.add(b));  // 输出: 0.3

浮点数溢出问题

浮点数虽然范围很大,但仍然有极限。当浮点数超出其表示范围时,会出现溢出问题。Java 对于溢出的处理方式不同于整数,它会返回 Infinity 或 -Infinity,而不是像整数那样回绕。

double large = 1.7E308;
double result = large * 10;
System.out.println("Overflow result: " + result);  // 输出: Infinity

类型自动提升(Type Promotion)

类型自动提升是指在表达式中,当参与运算的不同数据类型不一致时,Java 自动将较小的类型提升为较大的类型,以避免数据丢失。通常,这种提升遵循从低精度到高精度的顺序:

byte → short → int → long → float → double

float f = 2.5f;
int i = 10;
double result = f + i;  // int 自动提升为 float,然后结果再提升为 double
System.out.println("运算结果: " + result);  // 输出: 12.5

在上述示例中,int 类型的 i 自动提升为 float。

强制类型转换(Type Casting)

强制类型转换是将一个数据类型的值显式转换为另一个类型的过程。这通常用于将高精度的类型转换为低精度类型(比如将 double 转换为 int),或者在需要进行特定的类型转换时使用。强制转换可能会导致数据丢失,因此需要格外小心。

double d = 5.99;
int i = (int) d;  // 强制类型转换为 int,舍去小数部分
System.out.println("强制转换结果: " + i);  // 输出: 5

本期小知识

尽量避免在循环控制、比较等对精度要求较高的场景下使用浮点数,因为它们的精度限制和误差可能导致意外行为。在这种情况下,使用整数类型或 BigDecimal 会更安全。

【OJ每日一练】1191 - 浮点数向零舍入 文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习。说明:向零舍入的含义是,正数向下舍入,负数向上舍入。输入一个单精度浮点数,将其向零舍入到整数。提示:可以使用强制类型转换来实现。一个整数,即向零舍入到整数的结果。 阅读详情

相关推荐

【OJ每日一练】1200 - 计算浮点数相除的余数

计算两个双精度浮点数a和b的相除的余数,a和b都是正数的。这里余数(r)的定义是:a = k * b + r,其中 k是整数, 0

KJ.JK 2082

java浮点数详解,详细float,double,精度损失

float:4字节,double:8字节浮点数在机器中存放形式的简单说明:浮点数=符号位+指数位+尾数位不对,会报错。因为默认为double。double a = 1.1f这个可以。把小的放在大的,可以。

Theresa---Java后端 1468

【OJ每日一练】1190 - 输出浮点数

读入一个双精度浮点数,分别按输出格式“%f”,“%f”保留5位小数,“%e”和“%g”的形式输出这个整数,每次在单独一行上输出。文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习。第二行是按“%f”保留5位小数输出的双精度浮点数;第一行是按“%f”输出的双精度浮点数;第三行是按“%e”输出的双精度浮点数;第四行是按“%g”输出的双精度浮点数。

KJ.JK 530

Java 程序基础之浮点数运算

浮点数 0.1 在计算机中就无法精确表示,因为十进制的 0.1 换算成二进制是一个无限循环小数,很显然,无论使用 float 还是double,都只能存储一个0.1 的近似值。由于浮点数存在运算误差,所以比较两个浮点数是否相等常常会出现错误的结果。在计算机中,浮点数虽然表示的范围大,但是,浮点数有个非常重要的特点,就是浮点数常常无法精确表示。需要特别注意,在一个复杂的四则运算中,两个整数的运算不会出现自动提升的情况。浮点数运算和整数运算相比,只能进行加减乘除这些数值计算,不能做位运算和移位运算。

ihero的博客 1017

【OJ每日一练】1210 - 输出绝对值

文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习。输出这个浮点数的绝对值,保留到小数点后两位。输入一个浮点数,其绝对值不超过10000。输入一个浮点数,输出这个浮点数的绝对值。

KJ.JK 4851

【OJ每日一练】1187 - 输出保留3位小数的浮点数

问题描述: 读入一个单精度浮点数,保留3位小数输出这个浮点数。 注:“保留3位小数”,通常意味着四舍五入后保留3位小数。 输入 只有一行,一个单精度浮点数。 输出 也只有一行,读入的单精度浮点数。 样例 输入 12.34521 输出 12.345 Java代码: import java.util.*; public class Main{ public static void main(String[] args) { Scanner rd=new Scanner(System.in); float

KJ.JK 1282

java浮点数详解

浮点数的二进制表示包括三个部分:符号位(Sign),指数位(Exponent),和尾数位(Mantissa,也称为Significand)。这意味着浮点数的表示是有限的,并不能精确表示所有的小数。浮点数在计算机中的表示和运算常常伴随着精度丢失的风险,这是由于浮点数的存储方式以及浮点运算的本质导致的。这种表示方法允许计算机以固定的格式存储和计算浮点数,虽然可能会带来精度上的限制和计算上的误差。是一个处理浮点数和整数之间转换的重要工具,特别是在需要对浮点数的低级表示进行精确控制和分析的场景中。

2401_83707780的博客 2000

用Python的fengwo模块复刻通达信筹码峰(COST/WINNER),选股效率提升10倍

本文介绍了如何使用Python的fengwo模块高效复刻通达信的筹码峰(COST/WINNER)计算,显著提升选股效率。通过C++内核与多线程优化,fengwo模块将传统Python实现的数小时计算压缩至分钟级,解决了量化交易中的性能瓶颈问题。文章详细解析了筹码峰计算原理、fengwo模块的技术架构及实战应用,助力量化开发者构建高效选股系统。

weixin_29062823的博客 438

Java中浮点数的比较与运算

文章目录1.浮点数的计算1.1实例:1.2方法改进2. 浮点数的比较2.1 使用误差范围2.2 使用BigDecimal比较 参考博文,点击这里 1.浮点数的计算 在《Effective Java》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。BigDecimal一共有4个够造方法, 其中的两个构造...

weixin_42030357的博客 1501

lenovo联想拯救者Legion Y9000P 2022款2023款2024款笔记本电脑(82RF,82WK,82WQ,83DE,83DF)原装出厂Windows11预装OEM系统镜像下载

联想原装出厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想电脑管家、联想浏览器、联想软件商店、legionzone控制中心等预装程序。链接:https://pan.baidu.com/s/1YBji_oh7xOkq-NxnS8Mm8g?链接:https://pan.baidu.com/s/1S7_enXmuoja1a9ASvUT5Fg?拯救者Legion Y9000P IRX9H 2024款【83DE】原厂Win11系统包。

QQ17855069的博客 6506

【算法】—前缀和与差分详解

前缀和指一个数组的某下标之前的所有数组元素的和(即数列的前n项求和),前缀和是一种重要的预处理,能够降低算法的时间复杂度,可以快速地求出某一段的和,对于处理区间之间的问题是往往十分高效相比较其他算法而言,前缀和更像是一种解题的技巧,一种优化方式输入一个长度为 n 的整数序列。接下来再输入 m 个询问,每个询问输入一对 l,r 对于每个询问,输出原序列中从第 l 个数到第 r 个数的和5 32 1 3 6 41 21 32 4123453610。

DAY I 的成长之路 6021

JAVA数据类型——浮点数存储格式

Java浮点数存储格式   JAVA中浮点数有两个基础类型:float和double。float占据4个字节,double占 据8个字节。下面将以float类型为例,介绍浮点数的存储方式。double类型和 float类型的存储方式雷同。   1.浮点数的存储方式   浮点数的存储格式比较特殊,下图是4字节的float变量的存储示意图:   根据IEEE754浮点数表示

zdl543的专栏 8598

代码实现ROS2bag录制数据和回放数据(C++)

ROS2的ROS2bag功能可以将指定Topic中的数据以.db3的格式(不同于ROS)保存到本地文件中。读取文件数据可以实现数据回放。

m0_57124501的博客 3256

Java 每日一刊(第8期):流程控制

计算机程序本质上是艺术的一种表现形式。

DC1020的博客 1130

C#winform自定义绘制曲线控件实例

本文实例讲解自定义绘制曲线控件过程。 在实际项目中,需要绘制曲线,系统的提供的绘制曲线的控件有时不能满足自己的需要,需要根据项目需要定制开发曲线控件。 实例目标,实时绘制显示温湿度值曲线。

qq_30725967的博客 1734

c++ pcl点云处理(2025 长期更新)

目录1.常用的点云文件2.认识点云的文件格式3.点云的数据结构4.输入输出(IO)5.KD树6.Oc树(八叉树)7.点云可视化8.点云滤波9.点云拟合分割10.点云与图像11.特征点与特征描述及提取12.点云配准13.点云曲面重建

twnkie的博客 2257

Java核心技术卷1——运算符 每日笔记

原因是round方法返回的结果为long类型,由于存在信息丢失的可能性,所以只有使用显式的强制类型转换才能够将long类型才能将long类型转换为int类型。另外有3个虚线箭头,表示可能有精度损失的转换。可以看到,在必要的时候,int类型的值将会自动地转换为double类型。警告:如果试图将一个数值从一种类型强制转换为另一种类型,而又超过了目标类型的表示范围,结果就会截断成一个完全不同的值。在Java中,借鉴了C和C++中的做法,也提供了自增、自减运算符:n++将变量n的当前值加1,n–则将n的值减1。

阿常的博客 968

【K8S系列】在 Kubernetes 中使用 Prometheus 进行监控的详细指南

Prometheus 是一个开源的监控和报警工具,广泛用于 Kubernetes 环境中。本文将深入探讨如何通过 Kubernetes 中的注解配置 Prometheus 的抓取设置,以高效监控服务,并确保系统的可靠性和可维护性。

颜淡慕潇 2万+

java每日一题:取模运算与自增、自减运算

对取模运算符%来说,其操作数可以是整型数也可以是浮点数有。若是浮点数,则x % y 的结果使除完后剩下的浮点数部分。自增1和自减1运算都是一元运算。按模板要求,将【代码1】~【代码3】替换为相应的Java程序代码,使之输出结果正确。2.学习算术运算符中的自增、自减运算。学习算术运算符中的求模运算。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 348

【华为OD机试】创建二叉树(python, java, c++, js)

请按下列描达构建一颗二叉树,并返回该树的根节点: 1、先创建值为-1的根结点,根节点在第0层; 2、然后根据operations依次添加节点: operations[i] = [height, index] 表示对第 height 层的第index 个节点node, 添加值为i 的子节点: 若node 无「左子节点」。则添加左子节点; 若node 有「左子节点」但无「右子节点」,则添加右子节点: 否则不作任何处理。 height、index 均从0开始计数;index 指所在层的创建顺序。

A_D_I_D_A_S的博客 188

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java基础知识每日总结(3)---Java运算符

运算符 1.算术运算符 在Java中,用+、-、*、/表示加减乘除,求余操作用%表示。整数除以0将会产生一个异常,而浮点数除以0将会得到无穷大或NaN结果。 2.数学函数 在Java中有一个Math类,它包含了各种各样的数学函数。如计算一个数的平方根可以使用sqrt方法,sqrt(4)=2,计算一个数的幂用pow方法,pow(x,a)=x的a次幂,让一个数进行四舍五入运算用round方法。 注:s...

weixin_44084024的博客 366

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java中的运算神器 BigDecimal,了解一下?

点击上方的终端研发部,右上角选择“设为星标”每日早10点半,技术文章准时送上公众号后台回复“学习”,获取作者独家秘制精品资料作者:HikariCP原文:https://www.jians...

这个时代,作为程序员可能要学习小程序 446

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【JAVA-E3】每日一考

1.“&”和“&&”的异同 2.程序输出 3.定义三个int型变量并赋值,使用三元运算符或者if-else获取这三个数中的较大数的实现。 4.编写程序,声明2个double型变量并赋值。 5. 交换两个变量值的代码的实现

MengYa_Dream的博客 414

高级java每日一道面试题-2025年01月23日-基础篇-什么时候会发生精度缺失?如何避免?

在Java编程中,精度缺失是一个需要注意的风险。使用BigDecimal类:提供高精度的十进制数表示和计算,避免浮点数的精度丢失。避免使用浮点数进行精确计算:在需要高精度的场景中,尽量使用整数或BigDecimal类。了解数据类型的范围:熟悉各种数据类型的取值范围,避免溢出或下溢。使用适当的舍入模式:在进行BigDecimal运算时,选择合适的舍入模式以控制结果的精度。进行充分的测试和调试:确保算法的正确性和精度,使用断言和测试框架来验证结果。

qq_43071699的博客 1393

【秋招冲刺-每日打卡】应届生JAVA岗-每日5道高频面试题【Day2】-基础篇(2)

秋招冲刺-每日打卡,每日打开5道高频面试真题,从基础到框架、秋招向大厂出发!!!

2965

【每日八股】Java基础中面试你必须要掌握问题1

浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。简单来说,引用拷贝就是两个不同的引用指向同一个对象。参考链接:https://javaguide.cn/文章内容根据网上内容汇总整理,用于根据自身学习情况进行查漏补缺,大家也不妨看看自己是否还掌握这些知识点,能帮上忙就最好了!😘。

m0_69383623的博客 516
上一篇: Java 每日一刊(第6期):整数运算
下一篇: Java 每日一刊(第8期):流程控制
知行小栈
博客等级 码龄9年 2506粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值