Java运算的精度和溢出问题
2024-10-20 11:28:32
double和float的0.1问题
代码如下
public class demo2 {
public static void main(String[] args) {
float f=0.1f;
double d=0.1;
System.out.println(f==d);
System.out.println(f);
System.out.println(d);
}
}
按理说,输出应该是:
true
0.1
0.1
实质上,编译后的结果却是
老师在抛出这个怪异现象后,作为之前有过编程基础的我老脸一红
在现场,就挺懵逼的
查了百度,float的0.1二进制形式是001111011 10011001100110011001101,根据符号位换算为10进制表达
的值精确应该是这样计算 110011001100110011001101乘以2的负27次方
实际值是0.100000001490116119384765625,这样就产生了实际误差,对于精度更大的double而言也是如此;
所以两者的比较值是false
这一查立马想起了之前C语言课上老师讲过的float值的0问题
public class demo2 {
public static void main(String[] args) {
double d=10/9;
double a=1/10000000;
System.out.println(d==1);
System.out.println(a==0);
}
}
编译出来的结果竟是
亦或者是“大数吃小数”
float a=123456789101112f;
float b=a+1; ;
System.out.println(a==b);
System.out.println(a);
System.out.println(b);
编译输出:
所以在java运算中,带有浮点数比较的运算尽量用功能类Bigdecimal
数值溢出问题
int a=128;
byte b=(byte)a;
System.out.println(a);
System.out.println(b);
编译输出:
128
-128
原因是将a强制转换成byte型时出现了溢出现象,这点是容易看出的
而转化为-128的原因是因为在计算机中数值都以补码储存
128在a中存储形式为0000 0000 0000 0000 0000 0000 1000 0000
在强制转换中,(byte)a保留了a的低8位并赋值给了b
此时b=1000 0000
按补码转换规则,1000 0000=-128
可以以此类推,将a的值修改为271=1 0000 1111
则验证输出的b为15
int a=271;
byte b=(byte)a;
System.out.println(a);
System.out.println(b);
最新文章
- 【架构设计】分布式文件系统 FastDFS的原理和安装使用
- DPI深度包检测
- 【WIN10】绑定x:Bind
- Spring Trasnaction管理(3)- 事务嵌套
- 最轻量级的前端Mvc框架backbone
- Nodejs编码转化问题
- Physically Based Render in Game 序
- Qt StyleSheet皮肤(黑色,比较好看,而且很全)
- SDC(1)–Hold Time
- Service知识点总结
- Java框架学习之Hibernate入门
- IOS中 类扩展 xib
- TCP/IP 协议(摘抄)
- vc的环境变量配置和缺少mspdb60.dll的解决方法
- java 锁 Lock接口详解
- react-踩坑记录——swiper报错!
- sqoop无法导出parquet文件到mysql
- 如果非得了解下git系统... - 实践篇
- UEditor插入视频,Object Iframe等标签被过滤问题处理
- [翻译] LiquidFloatingActionButton
热门文章
- 驱动开发:内核枚举Registry注册表回调
- 网络工程知识(二)VLAN的基础和配置:802.1q帧;Access、Trunk、Hybrid接口工作模式过程与配置;VLANIF的小实验
- 「MySQL高级篇」explain分析SQL,索引失效&;&;常见优化场景
- TensorFlow?PyTorch?Paddle?AI工具库生态之争:ONNX将一统天下
- Python基础部分:8、for循环和range的使用
- CSS选择器大全48式
- vs 自定义代码块
- 抓包分析 TCP 握手和挥手
- Jupyter基本使用
- Perl exists 函数和defined函数的区别