首页 > 编程语言 >java实际开发——涉及金额时使用的数据类型BigDecimal

java实际开发——涉及金额时使用的数据类型BigDecimal

时间:2024-09-14 20:56:08浏览次数:11  
标签:float java BigDecimal 0.01 数据类型 标度 b1 b2

目录

首先说结论,使用 BigDecimal 类。

为什么不用其它的类型?(比如int、long、float、double)

1、整型:

2、浮点型:

BigDecimal类

基本数据类型与BigDecimal使用时的差别:

1、创建

2、+ - * /

3、比较

标度(Scale)

舍入模式


首先说结论,使用 BigDecimal 类。

为什么不用其它的类型?(比如int、long、float、double)

1、整型:

        int、long类型不能够表示小数部分,不符合金额的实际应用。

2、浮点型:

        float、double会有精度丢失,不推荐用于金额。

如下:      0.06 - 0.01 结果应该是0.05

float f1 = 0.01f;
float f2 = 0.06f;//float类型加f后缀(必须),double类型加d后缀(可无)
System.out.println(f2-f1);

double d1 = 0.01;
double d2 = 0.06;
System.out.println(d2-d1);

到这,我们已知这些基本的数据类型无法满足我们的需求,下面介绍一个类——BigDecimal

BigDecimal类

基本数据类型与BigDecimal使用时的差别:

1、创建

这是一个类,所以我们在创建时不是简单的赋值,而是需要new()对象。

(一定要注意,这里是需要用字符串 "0.01" 和字符串 "0.02" 创建,而不能用 0.01 和 0.02 创建。这是因为在使用 0.01 创建时是使用浮点数创建,浮点数的创建会产生误差,这个误差会被保存到了BigDecimal对象中。)

BigDecimal b1 = new BigDecimal("0.01");
BigDecimal b2 = new BigDecimal("0.02");
2、+ - * /

在运算时,也不能用 + - * / 等运算符,而是需要运用相对应的方法。

b2.add(b1);         //b2 + b1
b2.subtract(b1);    //b2 - b1
b2.multiply(b1);    //b2 * b1
b2.divide(b1);      //b2 / b1
3、比较

b2.compareTo(b1): 比较当前 BigDecimal 对象b1与b2的大小。
b2.equals(b1): 检查当前 BigDecimal 是否与指定的对象相等(包括标度)。

标度(Scale)

BigDecimal 有一个标度属性,表示小数点后的位数。标度的设置会影响值的精度。例如,new BigDecimal("1.2345") 的标度是4。

在进行计算时,如果没有适当设置标度,可能会导致精度损失或抛出异常(如在使用 divide() 方法时)


舍入模式

在某些操作(如除法)中,BigDecimal 需要指定舍入模式,以避免精度丢失。

常用的舍入模式包括:

进位:RoundingMode.UP                         ( 0.055 —> 0.06)

舍去后面的位数:RoundingMode.DOWN ( 0.055 —> 0.05)

四舍五入:RoundingMode.HALF_UP       (向上,0.055 —> 0.06)

四舍五入:RoundingMode.HALF_DOWN(向下,0.055 —> 0.05)

标签:float,java,BigDecimal,0.01,数据类型,标度,b1,b2
From: https://blog.csdn.net/Jilit_jilit/article/details/142180903

相关文章

  • 【JavaScript】LeetCode:707设计链表
    文章目录题目内容题目分析(1)获取第n个节点的值(2)头部插入节点(3)尾部插入节点(4)第n个节点前插入节点(5)删除第n个节点完整代码题目内容题目分析添加哨兵节点dummy。在第n个节点前插入节点时,应该找到第n-1个节点(即前一个节点),才能完成插入操作。在删除第n......
  • Java8中日期类的使用
    LocalDate:日期类LocalTime:时间类LocalDateTime:日期时间类相关操作创建时间privatestaticvoiddateTimeAndFormat(){//当前日期时间LocalDatedate1=LocalDate.now();//指定日期时间LocalDatedate2=LocalDate.of(2025,6,6);......
  • 高级java每日一道面试题-2024年9月09日-数据库篇-事务提交后数据仍然没有持久化,可能的
    如果有遗漏,评论区告诉我进行补充面试官:事务提交后数据仍然没有持久化,可能的原因是什么?我回答:在Java高级面试中,讨论事务提交后数据仍然没有持久化的问题是一个很好的切入点,可以帮助考察候选人对事务管理、持久化机制以及潜在的编程和配置错误的理解。下面详细解释可能......
  • 高级java每日一道面试题-2024年9月08日-前端篇-JS的执行顺序是什么样的?
    如果有遗漏,评论区告诉我进行补充面试官:JS的执行顺序是什么样的?我回答:JavaScript的执行顺序是由其特殊的执行环境所决定的。JS的执行环境包括全局执行环境、函数执行环境和eval执行环境。在这些环境中,变量和函数声明会被提升(hoisting),而变量赋值和函数调用则按照......
  • java计算机毕业设计剧本杀桌游收银系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着桌游文化的兴起与剧本杀游戏的迅速普及,线下剧本杀体验馆成为年轻人休闲娱乐的新宠。这类场所不仅提供了独特的社交场景,还融合了角色扮演、逻辑推......
  • java计算机毕业设计教学质量测评系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今教育信息化的浪潮中,教学质量的提升已成为教育改革的核心议题。随着高校规模的不断扩大和学生数量的激增,传统的教学管理模式面临着效率低下、信......
  • java计算机毕业设计简历系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景:随着信息技术的飞速发展,人才市场的竞争日益激烈,求职者与招聘方之间的信息匹配效率成为影响就业市场活力的关键因素。传统纸质简历的提交方式不仅效率......
  • java+vue计算机毕设短期租车平台【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和共享经济理念的深入人心,人们对出行方式的需求日益多样化与便捷化。传统租车行业虽已存在多年,但往往受限于手续繁琐、租车周期......
  • java+vue计算机毕设多媒体素材管理系统【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,多媒体内容已成为信息传播与交流的核心载体。从新闻报道到教育培训,从娱乐休闲到企业宣传,多媒体素材如视频、音频、图像等的应......
  • java+vue计算机毕设懂球之家网站【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和体育产业的蓬勃兴起,足球作为全球最受欢迎的运动之一,其相关信息与数据需求日益增长。球迷们渴望通过便捷、全面的平台获取......