java如何获取一个double的小数位数
前言
看标题是不是觉得这是一个很简单的问题,我一开始也是这么认为的,但是实际情况下,在各种情况下我们都进行了测试,发现很多实际情况是无法不尽如人意的。
方法分析
当前能想到的比较容易有下面几种
1、直接使用double处理
2、将double转换成String进行处理
方法一:直接对double进行处理,进行计算通过计算后的结果进行取模操作获取小数位数,如下:
public static int getNumberDecimalDigits(double number) { if (number == (long)number) { return 0; } int i = 0; while (true){ i++; if (number * Math.pow(10, i) % 1 == 0) { return i; } } }
方法二:将double转换成String后,然后利用“.”分割进行判断,如下:(这里double转换String有多种方式这里我们选择其中的一种)
public static int getNumberDecimalDigits(double number) { String moneyStr = String.valueOf(number); String[] num = moneyStr.split("\\."); if (num.length == 2) { for (;;){ if (num[1].endsWith("0")) { num[1] = num[1].substring(0, num[1].length() - 1); }else { break; } } return num[1].length(); }else { return 0; } }
测试方法:
public static void main(String[] args) { System.out.print(getNumberDecimalDigits(0)); System.out.print(" " + getNumberDecimalDigits(0.0)); System.out.print(" " + getNumberDecimalDigits(1)); System.out.print(" " + getNumberDecimalDigits(-11.1)); System.out.print(" " + getNumberDecimalDigits(1.01)); System.out.print(" " + getNumberDecimalDigits(0.0100)); System.out.print(" " + getNumberDecimalDigits(0.123456)); System.out.print(" " + getNumberDecimalDigits(11111111.1234)); System.out.print(" " + getNumberDecimalDigits(11.0123456789)); }
结果分析
测试结果:
方法一:0 0 0 1 2 2 6 5 11
方法二:0 0 0 1 2 2 6 13 10
为什么最后的结果和我们想象不一样呢???
原因有三个:
1、double计算丢失精度:
2.01 * 10 = 20.099999999999998
2、double转string丢失精度:
String.valueOf(11111111.1234) = 1.11111111234E7
11111111.1234 + "" = 1.11111111234E7
Double.valueOf(11111111.123) = 1.1111111123E7
...
总结
所以在当前情况下,只要使用double进行判断都会出现各种各样的问题,因为double精度的问题。
所以唯一能解决的办法就是,不要使用double,直接使用字符串,无论是从客户端传入的值还是生产的值都是直接使用字符串进行处理和判断,判断方法与方法二类似。
如果非要进行计算,请使用BigDecimal进行计算。new BigDecimal的时候注意一定要使用字符串作为参数进行new
如果你有更好的方法,能通过上面的测试,那赶紧评论让我膜拜膜拜~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?