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
如果你有更好的方法,能通过上面的测试,那赶紧评论让我膜拜膜拜~
java如何获取一个double的小数位数的更多相关文章
- Java实现获取一个随机的两位数
import java.util.Random; //获取一个随机的 两位数public class getrandomdouble { public static void main(String[ ...
- Java学习-047-数值格式化及小数位数四舍五入
此小工具类主要用于数值四舍五入.数值格式化输出,很简单,若想深入研究,敬请自行查阅 BigDecimal 或 DecimalFormat 的 API,BigDecimal.setScale(位数,四舍 ...
- java 获取一个整数的各个位数
两种方法~ 第一种是取模运算 第二种是使用char数组进行分割开依次存到数组[推荐第二种] 获取一个四位数的各个位数 int qian =input/1000; //千位除以1000 ...
- Java 递归获取一个路径下的所有文件,文件夹名称
package com.readfile; import java.io.File; public class GetAllFiles { public static void main(String ...
- java 递归获取一个目录下的所有文件路径
还是日志的问题,log4j生成的日志文件,自动保存到月份所在的文件夹中,需要获取到所有的日志文件,包括文件夹 private List<String> ergodic(File file, ...
- JAVA如何把一个float四舍五入到小数点后2位,4位,或者其它指定位数.
怎么使float保留两位小数或多位小数 http://meryvn.blog.163.com/blog/static/36962664201173010402629/ 两种方法: import j ...
- java实验三——求平均数,数组排序(有关java保留小数位数,由于编译器版本未到1.5导致的报错format函数第二个参数不对,要求是Object[])
package hello; import java.util.Arrays; public class 实验三更正版 { public static void main(String[] args) ...
- java.math.BigDecimal保留两位小数,保留小数,精确位数
http://blog.csdn.net/yuhua3272004/article/details/3075436 使用java.math.BigDecimal工具类实现 java保留两位小数问题 ...
- double四舍五入,商品金额大小写转换,设置货币的小数位数跟格式输出,进制转化
1:计算double值四舍五入的方法 对小数数值进行四舍五入,首先应该确认保留小数位, 如果数值的小数精度大于保留小数位,那么开始四舍五入计算.四舍五入的方法非常简单,在所有要丢失精度的小数位中加 ...
随机推荐
- maven的介绍及如何获取jar包
本文转载自 https://www.cnblogs.com/whgk/p/7112560.html 该篇文章篇幅较长,大概的思路如下 maven的介绍,初步认识,获取jar包的三个关键属性 --& ...
- Java平台
Java的平台无关性 不同的网络环境,操作系统 支持嵌入式设备 减少开发部署时间 Java自身的平台和语言 编译成class文件 可在Java虚拟机中运行,与外部环境无关(对虚拟机的依赖) 通过外部A ...
- LOJ-10097(2-sat问题)
题目链接:传送门 思路: 2-sat问题,如果选每个集合最多有两个元素,eg:(Ai,Ai’),(Bi,Bi’): 如果Ai,Bi冲突,就只能选Ai,Bi’(建立边),然后缩点,查找有无相同集合的点在 ...
- (PMP)第5章-----项目范围管理
产品范围:所具有的特征和功能 项目范围:必须完成的工作. 5.1 规划范围管理 输入 工具与技术 输出 1.项目章程 2.项目管理计划 (质量管理计划, 项目生命周期描述, 开发方法) 3.事业环境因 ...
- 模板基础model
一.Django-model基础 1.1ORM 映射关系: 表名<---------->类名 字段<---------->属性 表记录<---------->类实例 ...
- cobbler实现系统自动化安装centos
cobbler [epel] cobbler服务集成 PXE DHCP rsync Http DNS Kickstart IPMI[电源管理] 1.软件安装 yum install cobbler d ...
- MIPS汇编指令集
MIPS有三种指令格式: R型 6 5 5 5 5 6 op rs rt rd shamt funct 功能:寄存器-寄存器ALU操作 (算术运算,逻辑运算) I型 6 5 5 16 op rs rt ...
- Python之旅Day5 列表生成式 生成器 迭代器 装饰器
装饰器 器即函数,装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 装饰器涉及的知识点= 高阶函数+函数嵌套+闭包 在遵循下面两个原则的前提下为被装饰者新功能 ...
- 调用接口,发送https请求
调用https接口有两种方式 一:是导入证书; 证书调用https请求本人还不知道,希望看见此博客的大神给我回复. 二:是创建信任管理器. 第一步:实现X509TrustManager接口,里面的方法 ...
- 深入理解JVM(一)——基本原理
前言 JVM一直是java知识里面进阶阶段的重要部分,如果希望在java领域研究的更深入,则JVM则是如论如何也避开不了的话题,本系列试图通过简洁易读的方式,讲解JVM必要的知识点. 运行流程 我们都 ...