[转]java Double 类型比较运算符精度
java Double 类型比较运算符精度
觉得有用的话,欢迎一起讨论相互学习~
public class L26 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// double a= 300000;
double x= 300000.00000000003;//double比较,小数点后有效位
double y= 300000.000000000003;//主要注意的是double类型直接==/>=/<=的比较,涉及到有效位
System.out.println(x<=300000);
System.out.println(y<=300000);
}
}
/*
*output:
*false
true
* */
-
总结:double是双精度基本数据类型,double与double之间,涉及==(包括>=,<=)的比较,就得考虑double的精度问题。
-
如上面的例子,当x=300000.00000000003,与300000比较,得到的是false,说明300000.00000000003>300000;当y=300000.000000000003,与300000比较,得到的是true,说明300000.00000000003<=300000;(jvm实际判定的是300000.000000000003300000)猛然看上去,感觉不对啊,应该是大于啊。这就是double的精度问题。当小数点后位数 大于(17-6)11位时,jvm就会忽略这个精度,这时的y=300000.00000000000。所以jvm就会判定y300000.
-
这种情况,我们在开发时如果需要更精确的比较double类型,就要用到 BigDecimal 这个类了。(或者可以乘上一个较大的数1e7或8这种)
-
上面我为什么用17-6呢?看下这个例子:
public static void main(String[] args) {
double x= 3.0000000000000003;//double比较,小数点后有效位:17-(整数位)。总有效位为17位
double y= 30.000000000000003;//17位数字
double z= 300.00000000000003;
double w= 3000.0000000000003;
System.out.println(x==3);
System.out.println(y==30);
System.out.println(z==300);
System.out.println(w==3000);
System.out.println("--------------------分界线-------------------");
//小数后都加一个0
double x1= 3.00000000000000003;//18位数字
double y1= 30.0000000000000003;
double z1= 300.000000000000003;
double w1= 3000.00000000000003;
System.out.println(x1==3);
System.out.println(y1==30);
System.out.println(z1==300);
System.out.println(w1==3000);
}
}
/*
output:
false
false
false
false
--------------------分界线-------------------
true
true
true
true
*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)