Java 中怎么解决 0.1 + 0.2 不等于 0.3?

👆🏻👆🏻👆🏻关注博主,让你的代码变得更加优雅。

前言

Hutool 是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

官网:https://www.hutool.cn/

推荐说明

数字工具针对数学运算做工具性封装

最佳实践

引入pom


<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <!-- 请查看最新版本 https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
    <version>5.8.26</version>
</dependency>

加减乘除

  • **NumberUtil.add** 针对数字类型做加法
  • **NumberUtil.sub** 针对数字类型做减法
  • **NumberUtil.mul** 针对数字类型做乘法
  • **NumberUtil.div** 针对数字类型做除法,并提供重载方法用于规定除不尽的情况下保留小数位数和舍弃方式。

以上四种运算都会将double转为BigDecimal后计算,解决float和double类型无法进行精确计算的问题。这些方法常用于商业计算。

保留小数

保留小数的方法主要有两种:

  • **NumberUtil.round** 方法主要封装BigDecimal中的方法来保留小数,返回BigDecimal,这个方法更加灵活,可以选择四舍五入或者全部舍弃等模式。
double te1 = 123456.123456;
double te2 = 123456.128456;
Console.

log(round(te1,4));//结果:123456.1235
    Console.

log(round(te2,4));//结果:123456.1285
  • **NumberUtil.roundStr** 方法主要封装**String.format**方法,舍弃方式采用四舍五入。
double te1 = 123456.123456;
double te2 = 123456.128456;
Console.

log(roundStr(te1,2));//结果:123456.12
    Console.

log(roundStr(te2,2));//结果:123456.13

decimalFormat

针对 **DecimalFormat.format**进行简单封装。按照固定格式对double或long类型的数字做格式化操作。

long c = 299792458;//光速
String format = NumberUtil.decimalFormat(",###", c);//299,792,458

格式中主要以 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充,# 表示只要有可能就把数字拉上这个位置。

  • 0 -> 取一位整数
  • 0.00 -> 取一位整数和两位小数
  • 00.000 -> 取两位整数和三位小数
  • -> 取所有整数部分

  • #.##% -> 以百分比方式计数,并取两位小数
  • #.#####E0 -> 显示为科学计数法,并取五位小数
  • ,### -> 每三位以逗号进行分隔,例如:299,792,458
  • 光速大小为每秒,###米 -> 将格式嵌入文本

关于格式的更多说明,请参阅:Java DecimalFormat的主要功能及使用方法

是否为数字

  • **NumberUtil.isNumber** 是否为数字
  • **NumberUtil.isInteger** 是否为整数
  • **NumberUtil.isDouble** 是否为浮点数
  • **NumberUtil.isPrimes** 是否为质数

随机数

  • **NumberUtil.generateRandomNumber** 生成不重复随机数 根据给定的最小数字和最大数字,以及随机数的个数,产生指定的不重复的数组。
  • **NumberUtil.generateBySet** 生成不重复随机数 根据给定的最小数字和最大数字,以及随机数的个数,产生指定的不重复的数组。

整数列表

**NumberUtil.range** 方法根据范围和步进,生成一个有序整数列表。 **NumberUtil.appendRange** 将给定范围内的整数添加到已有集合中

其它

  • **NumberUtil.factorial** 阶乘
  • **NumberUtil.sqrt** 平方根
  • **NumberUtil.divisor** 最大公约数
  • **NumberUtil.multiple** 最小公倍数
  • **NumberUtil.getBinaryStr** 获得数字对应的二进制字符串
  • **NumberUtil.binaryToInt** 二进制转int
  • **NumberUtil.binaryToLong** 二进制转long
  • **NumberUtil.compare** 比较两个值的大小
  • **NumberUtil.toStr** 数字转字符串,自动并去除尾小数点儿后多余的0

写在最后

给大家推荐一个非常完整的Java项目搭建的最佳实践,也是本文的源码出处,由大厂程序员&EasyExcel作者维护。
github地址:https://github.com/zhuangjiaju/easytools
gitee地址:https://gitee.com/zhuangjiaju/easytools

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

庄家钜Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值