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);

最新文章

  1. 【架构设计】分布式文件系统 FastDFS的原理和安装使用
  2. DPI深度包检测
  3. 【WIN10】绑定x:Bind
  4. Spring Trasnaction管理(3)- 事务嵌套
  5. 最轻量级的前端Mvc框架backbone
  6. Nodejs编码转化问题
  7. Physically Based Render in Game 序
  8. Qt StyleSheet皮肤(黑色,比较好看,而且很全)
  9. SDC(1)–Hold Time
  10. Service知识点总结
  11. Java框架学习之Hibernate入门
  12. IOS中 类扩展 xib
  13. TCP/IP 协议(摘抄)
  14. vc的环境变量配置和缺少mspdb60.dll的解决方法
  15. java 锁 Lock接口详解
  16. react-踩坑记录——swiper报错!
  17. sqoop无法导出parquet文件到mysql
  18. 如果非得了解下git系统... - 实践篇
  19. UEditor插入视频,Object Iframe等标签被过滤问题处理
  20. [翻译] LiquidFloatingActionButton

热门文章

  1. 驱动开发:内核枚举Registry注册表回调
  2. 网络工程知识(二)VLAN的基础和配置:802.1q帧;Access、Trunk、Hybrid接口工作模式过程与配置;VLANIF的小实验
  3. 「MySQL高级篇」explain分析SQL,索引失效&&常见优化场景
  4. TensorFlow?PyTorch?Paddle?AI工具库生态之争:ONNX将一统天下
  5. Python基础部分:8、for循环和range的使用
  6. CSS选择器大全48式
  7. vs 自定义代码块
  8. 抓包分析 TCP 握手和挥手
  9. Jupyter基本使用
  10. Perl exists 函数和defined函数的区别