当前位置: 首页 > news >正文

进阶JAVA篇- BigDecimal 类的常用API(四)

目录

API                

        1.0 BigDecimal 类说明

        1.1 为什么浮点数会计算不精确呢?

        1.2  如何创建 BigDecimal 类型的对象

                1.2.1具体来介绍三种方式来创建:

                1.2.2 结合三种创建方法,一起来分析一下。 

        1.3 BigDecimal 类中的 valueOf(String str) 方法

        1.4 BigDecimal 类中的 add() 方法(加减乘除的操作都是一样的,就不多赘述了)

        1.5 BigDecimal 类中的 doubleValue() 方法


API                

        1.0 BigDecimal 类说明

        BigDecimal 类是Java中用于精确表示大数的类,可以进行精确的数值运算。在需要精确计算的场景中,可以使用 BigDecimal 类来避免由于浮点数计算误差导致的计算结果不准确的问题。

        1.1 为什么浮点数会计算不精确呢?

代码如下:

public class Text {public static void main(String[] args) {double data1 = 0.1;double data2 = 0.2;System.out.println(data1+data2);}
}

运行代码如下:

        结果不是0.3,显然结果跟我们预想的不一样。当然不是所以的浮点数运行出来的结果都是错误的,只是有这一部分是运行出来的结果是错误的,但是这一部分我们作为合格的程序员来说是不能接收的。

          浮点数在计算机中的表示方式是通过将数值分为两部分:尾数和指数。尾数用来表示数值的有效位数,而指数用来表示数值的大小范围。然而,由于计算机内存的限制,尾数和指数都只能用有限的位数来表示,这就导致了浮点数的精度有限。

  1. 二进制表示:计算机使用二进制来表示浮点数,而大部分十进制数无法精确转换为二进制表示。例如,0.1(十进制)在二进制表示中是一个无限循环的小数0.00011001100110011...,因此在计算机中只能近似表示。

  2. 有限的位数:浮点数的尾数和指数都只能用有限的位数来表示,这就导致了浮点数的精度有限。例如,Java中的double类型只能精确表示15位有效数字,超过这个范围的数字会被截断或四舍五入。

  3. 浮点数运算误差:在进行浮点数运算时,由于尾数和指数的有限位数表示,计算机无法精确表示所有的运算结果。这就导致了浮点数运算的结果可能存在一定的误差。

  4. 舍入误差:在将一个浮点数转换为二进制表示时,可能会存在舍入误差。例如,一个无限循环的小数在转换为二进制表示时会被截断或四舍五入,从而导致精度损失。 

        1.2  如何创建 BigDecimal 类型的对象

                1.2.1具体来介绍三种方式来创建:

1.代码如下: 

import java.math.BigDecimal;public class BigDecimalMethod1 {public static void main(String[] args) {//先定义了两个基本数据类型,我们知道//0.1 + 0.2 在double 类型运行是不精确的double data1 = 0.1;double data2 = 0.2;//由基本数据类型转变为引用类型//利用自动装箱,在等号后面可以直接写基本数据类型,它会自动装箱Double d1 = data1;Double d2 = data2;//将Double类型转变为String类型//利用Double类型实例方法toString()String s1 = d1.toString();String s2 = d2.toString();//利用构造器传进字符串来创建对象,//由字符串类型转变为BigDecimal类型BigDecimal b1 = new BigDecimal(s1);BigDecimal b2 = new BigDecimal(s2);//BigDecimal类中的实例方法 add()方法,//将两个BigDecimal类型相加BigDecimal c = b1.add(b2);//调用BigDecimal的实例方法 doubleValue(),//将BigDecimal类型转变为基本数据类型double a = c.doubleValue();//+1是为了表达a是浮点型,不是字符串System.out.println(a+1);}}

运行结果如下:

 

 

2.代码如下:

import java.math.BigDecimal;public class BigDecimalMethod2 {public static void main(String[] args) {//先定义了两个基本数据类型,我们知道//0.1 + 0.2 在double 类型运行是不精确的double data1 = 0.1;double data2 = 0.2;//直接调用Double类中的静态方法toString(),//转变为字符串String s1 = Double.toString(data1);String s2 = Double.toString(data2);//利用有参数的构造器,传入字符串创建对象BigDecimal b1 = new BigDecimal(s1);BigDecimal b2 = new BigDecimal(s2);//BigDecimal类中的实例方法 add()方法,//将两个BigDecimal类型相加BigDecimal c = b1.add(b2);//调用BigDecimal的实例方法 doubleValue(),//将BigDecimal类型转变为基本数据类型double a = c.doubleValue();//+1是为了表达a是浮点型,不是字符串System.out.println(a + 1);}}

运行结果如下:

 3.代码如下:

import java.math.BigDecimal;public class BigDecimalMethod3 {public static void main(String[] args) {//先定义了两个基本数据类型,我们知道//0.1 + 0.2 在double 类型运行是不精确的double data1 = 0.1;double data2 = 0.2;//这个就更加直接了,直接用BigDecimal中静态方法,//将浮点数类型转变为BigDecimal类型BigDecimal b1 = BigDecimal.valueOf(data1);BigDecimal b2 = BigDecimal.valueOf(data2);//BigDecimal类中的实例方法 add()方法,//将两个BigDecimal类型相加BigDecimal c = b1.add(b2);//将BigDecimal类型转变为浮点数类型double a = c.doubleValue();//+1是为了表达a是浮点型,不是字符串System.out.println(a+1);}
}

运行代码如下:

                1.2.2 结合三种创建方法,一起来分析一下。 

         第一种方式与第二种方式都是通过浮点型转变为字符串,然后再通过构造器转入字符串来创建BigDecimal 类型的对象,二者的区别在于有无创建Double对象,第一种是通过创建对象得到实例方法 toString() 将浮点型转变为字符串,而第二种没有创建Double对象,直接用Double类的静态方法 toString() 将浮点型转变为字符串。这两种方式的历程是由 浮点数 - 字符串 - BigDecimal类型。

        第三种是直接调用BigDecimal 类中的静态方法来创建对象,历程是 浮点数 - BigDecimal类型。事实上,第三种是第二种的封装。即JAVA中为了方便,为了效率,将第二种的长串的代码“封装”成第三种方法。

 

        1.3 BigDecimal 类中的 valueOf(String str) 方法

        通过传进字符串来创建方法,由于上面有详细讲到,就不多赘述了。

        1.4 BigDecimal 类中的 add() 方法(加减乘除的操作都是一样的,就不多赘述了)

         两个BigDecimal 类型的对象进行相加,得到总和。

代码如下:

import java.math.BigDecimal;public class Text {public static void main(String[] args) {double data1 = 0.1;double data2 = 0.2;BigDecimal b1 = BigDecimal.valueOf(data1);BigDecimal b2 = BigDecimal.valueOf(data2);BigDecimal c = b1.add(b2);System.out.println(c);}
}

运行结果:

         其他运算的方法:

                减法 subtract(),乘法 multiply(),除法 divide()

                其中 divide()还可以指定小数点后的几位数。

代码如下:

import java.math.BigDecimal;public class Text {public static void main(String[] args) {double data1 = 0.1;double data2 = 0.3;BigDecimal b1 = BigDecimal.valueOf(data1);BigDecimal b2 = BigDecimal.valueOf(data2);BigDecimal c = b1.divide (b2,5);System.out.println(c);}
}

运行结果:

        假如0.1/0.3 不去指定位数的时候,会报错。

import java.math.BigDecimal;public class Text {public static void main(String[] args) {double data1 = 0.1;double data2 = 0.3;BigDecimal b1 = BigDecimal.valueOf(data1);BigDecimal b2 = BigDecimal.valueOf(data2);BigDecimal c = b1.divide (b2);System.out.println(c);}
}

运行结果:

        1.5 BigDecimal 类中的 doubleValue() 方法

        BigDecimal 类型转变为 double 类型。

代码如下:

import java.math.BigDecimal;public class Text {public static void main(String[] args) {double data1 = 0.1;double data2 = 0.3;BigDecimal b1 = BigDecimal.valueOf(data1);BigDecimal b2 = BigDecimal.valueOf(data2);BigDecimal c = b1.add (b2);double a = c.doubleValue();System.out.println(a);}
}

运行结果如下:

      



相关文章:

进阶JAVA篇- BigDecimal 类的常用API(四)

目录 API 1.0 BigDecimal 类说明 1.1 为什么浮点数会计算不精确呢? 1.2 如何创建 BigDecimal 类型的对象 1.2.1具体来介绍三种方式来创建: 1.2.2 结合三种创建方法,一起来分析一下。 1.3 BigDecimal 类中的 valueOf(Strin…...

UE4 顶点网格动画播放后渲染模糊问题

问题描述:ABC格式的顶点网格动画播放结束后,改模型看起来显得很模糊有抖动的样子 解决办法:关闭逐骨骼动态模糊...

centos 磁盘挂载与解挂

磁盘挂载 查看已挂载的磁盘 df -TH查看磁盘分区,对比第一步,看哪些磁盘没有挂载,例如发现/dev/sdb的磁盘没有在第一步中显示 fdisk -l磁盘分区(/dev/sdb为上一步骤中没有挂载的磁盘) fdisk /dev/sdb执行上一命令后…...

C语言 位操作

定义 位操作提高程序运行效率,减少除法和取模的运算。在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。 左移 后空缺自动补0 右移 分为逻辑右移和算数右移 逻辑右移 不管什么类型&am…...

Go语言中入门Hello World以及IDE介绍

您可以阅读Golang教程第1部分:Go语言介绍与安装 来了解什么是golang以及如何安装golang。 Go语言已经安装好了,当你开始学习Go语言时,编写一个"Hello, World!"程序是一个很好的入门点。 下面将会提供了一些有关IDE和在线编辑器的…...

Java面试题-Java核心基础-第二天(基本语法)

目录 一、注释有几种形式 二、标识符与关键字的区别 三、自增自减运算符 四、移位运算符 五、continue、break、return的区别 一、注释有几种形式 注释除了有其他编程语言有的单行注释和多行注释之外,还有其Java特有的文档注释 文档注释能够使用javadoc命令就…...

Linux 部署 GitLab idea 连接

概述 GitLab 是一个开源的代码管理平台,使用 Git 作为版本控制工具,提供了 Web 界面和多种功能,如 wiki、issue 跟踪、CI/CD 等。 GitLab 可以自托管或使用 SaaS 服务,支持多种操作系统和执行器。 GitLab 可以帮助软件开发团队…...

Java延迟队列——DelayQueue

Java延迟队列——DelayQueue DelayQueue的定义 public class DelayQueue<E extends Delayed> extends AbstractQueue<E> implements BlockingQueue<E>DelayQueue是一个无界的BlockingQueue&#xff0c;是线程安全的&#xff08;无界指的是队列的元素数量不存…...

Vulnhub系列靶机---Raven2

文章目录 Raven2 渗透测试信息收集提权UDF脚本MySQL提权SUID提权 Raven2 渗透测试 信息收集 查看存活主机 arp-scan -l 找到目标主机。 扫描目标主机上的端口、状态、服务类型、版本信息 nmap -A 192.168.160.47目标开放了 22、80、111 端口 访问一下80端口&#xff0c;并…...

设计模式-生成器模式

生成器模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;用于构建复杂的对象。这种模式将构造代码和表示代码分离开来&#xff0c;使得同样的构造过程可以创建不同的表示。 以下是一个简单的Java实现&#xff1a; // 产品 class Product …...

Nginx正向代理配置(http)

前言 在工作中我们经常使用nginx进行反向代理,今天介绍下怎么进行正向代理,支持http请求,暂不支持https 首先先介绍下正向代理和反向代理。 正向代理 在客户端&#xff08;浏览器&#xff09;配置代理服务器&#xff0c;通过代理服务器进行互联网访问。 反向代理 客户端只…...

ARMv5架构对齐访问异常问题

strh非对齐访问 在ARMv5架构中&#xff0c;对于strh指令&#xff08;Store Halfword&#xff09;&#xff0c;通常是要求对地址进行对齐访问的。ARMv5架构对于半字&#xff08;Halfword&#xff09;的存储操作有对齐要求&#xff0c;即地址必须是2的倍数。 如果尝试使用strh指…...

Go中varint压缩编码原理分析

文章目录 编码介绍无符号整数较小的值较大的值Go中的实现编码PutUvarint解码Uvarint 有符号整数较小的值(指绝对值)较大的负数(只绝对值)Go中的实现编码PutVarint解码Varint 总结 编码介绍 varint是一种将整数编码为变长字节的压缩编码算法&#xff0c;本篇文章就是分析该编码…...

在IDEA中如何用可视化界面操作数据库? 在idea中如何操作数据库? 在idea中如何像Navicat一样操作数据库?

1、找到database&#xff0c;创建连接 我用了中文包&#xff0c;英文状态下和我的操作完全一样 英文下第二列数据库名称为 database 2、配置相关属性&#xff0c;如IP地址&#xff0c;密码等 3、选择对应的库名&#xff0c;此处也叫架构 4、然后就可以进行愉快的操作了...

数据库安全-RedisHadoopMysql未授权访问RCE

目录 数据库安全-&Redis&Hadoop&Mysql&未授权访问&RCE定义漏洞复现Mysql-CVE-2012-2122 漏洞Hadoop-配置不当未授权三重奏&RCE 漏洞 Redis-未授权访问-Webshell&任务&密匙&RCE 等漏洞定义&#xff1a;漏洞成因漏洞危害漏洞复现Redis-未授权…...

辅助驾驶功能开发-功能规范篇(27)-3-导航式巡航辅助NCA华为

书接上回 2.2.2.3.7控制模块 控制模块由横向控制和纵向控制组成。根据横、纵向规划给出的行驶轨迹和给定速度,进行车辆的纵横向控制,输出方向盘转角、加速度或制动踏板开度和档位信息,必要条件下输出车灯信号等。 2.2.2.4 行为仲裁模块 纵向状态: 当纵向位于Off/Standby…...

探索UI设计|栅格系统的深入分析和应用

界面排版太乱了。你知道网格系统的用途吗&#xff1f;网格系统困扰着许多初级网页设计师&#xff0c;就像一个谜。如果您对网格在设计中的应用有任何疑问&#xff0c;本文是为您量身定制的&#xff0c;并深入分析UI设计中网格系统的基本要素和优点。 什么是网格系统 网格系统…...

AI 律助 Alpha GPT 线上实操发布会,重磅发布!

数字化时代,随着人工智能的迅猛发展,各行各业都在积极探索通过智能化工具实现工作效率翻升的可能性。“ ChatGPT 类产品”是未来办公应用软件发展的重要趋势之一,但如何将 ChatGPT 真正应用于法律人的工作,赋能效率提升?法律行业同样面临着新的挑战和机遇。 破局的关键是实现技…...

【漏洞复现】安全云平台存在任意文件下载getshell

漏洞描述 深圳市强鸿电子有限公司鸿运主动安全云平台存在任意文件下载漏洞,攻击者可通过此漏洞下载敏感文件信息。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权…...

【JUC】原子操作类及LongAddr源码分析

文章目录 1. 十八罗汉2. 原子类再分类2.1 基本类型原子类2.2 数组类型原子类2.3 引用类型原子类2.4 对象的属性修改原子类2.5 原子操作增强类 3. 代码演示及性能比较&#xff1a;4. LongAddr原理5. LongAddr源码分析5.1 add()5.2 longAccumulate()5.3 sum() 6. 小总结6.1 Atomi…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...