Java BigDecimal类

原因

  • 为什么要有BigDecimal类
  • 因为二进制的缘故,直接对浮点数进行运算,会导致精度丢失的问题
  • 下例:出现了0.1 + 0.2 <> 0.3
    在这里插入图片描述

常见的API

  • 这些API中,并不推荐double类型转换的BigDecimal,因为底层还是double
  • 推荐使用由string 类型转换的BigDecimal,因为它是以字符串串的形式存储数据,甚至是每一位小数点。
    在这里插入图片描述

在这里插入图片描述

常见转换和运算方式

Double a = 0.1;
Double b = 0.2;
Double c = a + b;
System.out.println(c); // 0.30000000000000004// 使用BigDecimal解决(错误方式)
BigDecimal bigDecimal1 = new BigDecimal(a);
BigDecimal bigDecimal2 = new BigDecimal(b);
BigDecimal bigDecimal3 = bigDecimal1.add(bigDecimal2);
//结果还错的 0.3000000000000000166533453693773481063544750213623046875
System.out.println(bigDecimal3);// 使用BigDecimal解决(正确方式)`在这里插入代码片`
// 先将所有的double类型转换成String类型 再转换成BigDecimal类型
BigDecimal bigDecimal4 = new BigDecimal(a.toString());
BigDecimal bigDecimal5 = new BigDecimal(b.toString());
BigDecimal bigDecimal6 = bigDecimal4.add(bigDecimal5);
System.out.println(bigDecimal6); // 0.3

其实jdk提供了更为简便的valueOf(),这玩意儿熟悉吧,每一个包装类都有一个API,传入一个double类型,会自动转换为字符串类型,再转换为BigDecimal类型

// 使用BigDecimal解决(正确方式)
// 使用BigDecimal的valueOf方法
BigDecimal bigDecimal7 = BigDecimal.valueOf(a);
BigDecimal bigDecimal8 = BigDecimal.valueOf(b);
BigDecimal bigDecimal9 = bigDecimal7.add(bigDecimal8);
System.out.println(bigDecimal9); // 0.3

加减乘除

// 加减乘除
BigDecimal add = bigDecimal7.add(bigDecimal8);
BigDecimal subtract = bigDecimal7.subtract(bigDecimal8);
BigDecimal multiply = bigDecimal7.multiply(bigDecimal8);
BigDecimal divide = bigDecimal7.divide(bigDecimal8);
System.out.println(add); // 0.3
System.out.println(subtract); // -0.1
System.out.println(multiply); // 0.02
System.out.println(divide); // 0.5

除法比较特殊 如果除不尽,没有确定保留位数,就会报错
在这里插入图片描述

BigDecimal divide1 = BigDecimal.valueOf(0.1).divide(BigDecimal.valueOf(0.3));
// 除不尽的情况下,可以指定保留小数点后几位,以及舍入模式
BigDecimal divide1 = BigDecimal.valueOf(0.1).divide(BigDecimal.valueOf(0.3), 2, BigDecimal.ROUND_HALF_UP);
System.out.println(divide1); // 0.33

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/797362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT5-qmediaplayer播放视频及进度条控制实例

qmediaplayer是QT5的播放视频的一个模块。它在很多时候还是要基于第三方的解码器。这里以Ubuntu系统为例&#xff0c;记录其用法及进度条qslider的控制。 首先&#xff0c;制作一个简单的界面文件mainwindow.ui&#xff1a; 然后&#xff0c;下载一个mp4或其他格式视频&#x…

【算法集训】基础算法:二分查找 | 概念篇

二分枚举&#xff0c;也叫二分查找&#xff0c;指的就是给定一个区间&#xff0c;每次选择区间的中点&#xff0c;并且判断区间中点是否满足某个条件&#xff0c;从而选择左区间继续求解还是右区间继续求解&#xff0c;直到区间长度不能再切分为止。 由于每次都是把区间折半&am…

小程序实现订阅功能和测试发送订阅信息

现在一次性订阅是只能用户点一次才能发送一次&#xff0c;而针对长期模板只有规定的几种类目政务、民生、交通等等的才可以&#xff0c;所以说感觉这功能其实已经不是很适合使用了&#xff0c;只适合一些特别的场景才可以使用。 地址&#xff1a;https://developers.weixin.qq…

where 函数

Pandas 中的 where 函数 在 Pandas 中&#xff0c;where 函数用于替换不满足条件的值。具体来说&#xff0c;它返回一个与原始 DataFrame 或 Series 形状相同的新对象&#xff0c;但所有不满足条件的值都被替换为指定的值&#xff08;默认为 NaN&#xff09;。 对于 DataFram…

【Web应用技术基础】JavaScript(7)——案例:点击文字则放大字体

视频已发。截图如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

Java基础知识总结(43)

&#xff08;1&#xff09;初始化块 和构造方法具有相同功能的是初始化块。当创建Java对象时&#xff0c;系统总是先调用类中定义的初始化块 &#xff08;2&#xff09;静态初始化块 如果定义初始化块使用了static修饰&#xff0c;则这个初始化块就变成了静态初始化块&#xf…

html基础介绍

概念 HTML 文件 扩展名是 .html 的文件称为网页文件或者HTML文件HTML 文件使用代码编辑进行编辑&#xff0c;使用浏览器查看效果 声明方式 <!Doctype html>&#xff01;DOCTYPE 是一个文档类型标记&#xff0c;是一种标准通用标记语言的文档类型声明&#xff0c;在 w…

2024.4.6-day11-CSS 背景和精灵图

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业2024.4.6学习笔记1 背景2 背景图片3 CSS 精灵图 作业 <!DOCTYPE html&…

项目中 使用 spring cache redis 出现大量keys* 慢查询排查以及修复

前言 业务反馈 redis里有大量的慢查询 而且全是keys 的命令 排查 首先登录 阿里云查看redis的慢查询日志 如下 主要使用到redis cache的注解功能 分别是 CacheEvict 和 Cacheable 注意 CacheEvict 这个比较特殊 会进行驱逐缓存 说白就会删除缓存或者让缓存失效 第一时间想…

第十四届蓝桥杯省赛大学C组(C/C++)填充

原题链接&#xff1a;填充 有一个长度为 n 的 01 串&#xff0c;其中有一些位置标记为 ?&#xff0c;这些位置上可以任意填充 0 或者 1&#xff0c;请问如何填充这些位置使得这个 01 串中出现互不重叠的 0 和 1 子串最多&#xff0c;输出子串个数。 输入格式 输入一行包含一…

golang 数组和切片

区别 1.数组长度固定&#xff0c;切片长度可变 2.数组是深拷贝&#xff0c;切片是浅拷贝&#xff0c;切片是引用类型 扩容规则 不同版本不一样 https://www.jb51.net/article/280481.htm#_lab2_2_1 go1.18 1.如果期望容量大于当前容量的两倍就会使用期望容量&#xff1b; 2.如…

【保姆级教程】如何在 Windows 上实现和 Linux 子系统的端口映射

写在前面 上次分享【保姆级教程】Windows上安装Linux子系统&#xff0c;搞台虚拟机玩玩&#xff0c;向大家介绍了什么是虚拟机以及如何在Windows上安装Linux虚拟机。对于开发同学而言&#xff0c;经常遇到的一个问题是&#xff1a;很多情况下代码开发需要依赖 Linux 系统&…

基于单片机的风向风速传感器防冻装置设计

摘 要:高海拔地区冬季由于冻雨常会造成风向风速传感器被冻结,导致探测数据的缺测。基 于单片机的强大功能,文章设计制作了一种可对风向风速进行自动加热的防冻装置,整个装置 以单片机为核心控制器,主要包括单片机控制电路、继电器驱动电路、温度采集电路,电热丝控 制电路…

多线程代码设计模式之单例模式

目录 设计模式引入 饿汉模式 懒汉模式 单例模式总结 设计模式引入 1.1.什么是设计模式 &#xff08;1&#xff09;设计模式就是一种代码的套用模板。例如&#xff1a;一类题型的步骤分别有哪些&#xff0c;是可以直接套用的。 &#xff08;2&#xff09;像棋谱&#xff…

代码随想录算法训练营DAY17|C++二叉树Part.4|110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

文章目录 110.平衡二叉树思路伪代码CPP代码 257.二叉树的所有路径思路伪代码实现CPP代码 404.左叶子之和思路伪代码CPP代码 110.平衡二叉树 力扣题目链接 文章讲解&#xff1a;110.平衡二叉树 视频讲解&#xff1a;后序遍历求高度&#xff0c;高度判断是否平衡 | LeetCode&…

后端返回二进制,前段导出excel

axios({method: post,url: URL,responseType: blob,}).then(async res > {let blob new Blob([res.data], { type: application/vnd.ms-excel;charsetutf-8 });let href window.URL.createObjectURL(blob); //创建下载的链接const link document.createElement(a);link.h…

lua学习笔记6(经典问题输出99乘法表)

print("************for循环的99乘法表*************") for i 1, 9 dolocal line "" -- 创建一个局部变量来累积每行的输出--local 是一个关键字&#xff0c;用于声明一个局部变量。for j 1, i doline line .. j .. "*" .. i .. ""…

电脑桌面上表格不见了怎么找回?这5个方法不要错过

在日常的办公和学习中&#xff0c;电脑桌面上的各种文件、文件夹和表格等无疑是我们较为频繁使用的资源。然而&#xff0c;有时我们可能会因为一些操作失误或者电脑问题&#xff0c;突然发现桌面上的某个表格文件神秘失踪了。面对这种情况&#xff0c;很多人可能会感到焦虑和不…

[WIP]Sora相关工作汇总VQGAN、MAGVIT、VideoPoet

视觉任务相对语言任务种类较多(detection, grounding, etc.)、粒度不同 (object-level, patch-level, pixel-level, etc.)&#xff0c;且部分任务差异较大&#xff0c;利用Tokenizer核心则为如何把其他模态映射到language space&#xff0c;并能让语言模型更好理解不同的视觉任…

Python-VBA函数基础知识-001

一、函数的定义&#xff1a; 函数(Function)是一段可重复使用的代码块&#xff0c;用于执行特定的任务或计算&#xff0c;并可以接受输入参数和返回输出结果。函数可以将复杂的问题分解为更小的子问题&#xff0c;提高代码的可读性和可维护性。 二、函数的组成&#xff1a; 在…