Java运算的精度和溢出问题
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);

Java运算的精度和溢出问题的更多相关文章
- 关于Java中用Double型运算时精度丢失的问题
注:转自 https://blog.csdn.net/bleach_kids/article/details/49129943 在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在 ...
- Java中的小数运算与精度损失
float.double类型的问题 我们都知道,计算机是使用二进制存储数据的.而平常生活中,大多数情况下我们都是使用的十进制,因此计算机显示给我们看的内容大多数也是十进制的,这就使得很多时候数据需要在 ...
- 【深入Java虚拟机】之一:Java内存模型与内存溢出
[深入Java虚拟机]之:Java内存区域与内存溢出 高速缓存模型如下: ----------------------------------------------------分割线-------- ...
- java中三种常见内存溢出错误的处理方法
更多 10 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的 ...
- 深入理解java虚拟机系列(一):java内存区域与内存溢出异常
文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上 ...
- java中三种常见内存溢出错误的处理方法(good)
相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的认识. 在解决j ...
- Java内存区域与内存溢出异常(JVM学习系列1)
相对于C.C++等语言来说,Java语言一个很美好的特性就是自动内存管理机制.C语言等在申请堆内存时,需要malloc内存,用完还有手动进行free操作,若程序员忘记回收内存,那这块内存就只能在进程退 ...
- 计算价格, java中浮点数精度丢失的解决方案
计算价格, java中浮点数精度丢失的解决方案
- 《深入理解java虚拟机》第二章 Java内存区域与内存溢出异常
第二章 Java内存区域与内存溢出异常 2.2 运行时数据区域
- zabbix3.0.4关于java服务端程序内存溢出的处理
关于java服务端程序内存溢出的处理 java服务端程序内存溢出会产生jvm.log文件,此时程序会挂掉,无法正常处理业务,需要重启服务 思路: 当存在jvm.log这个文件的时候则触发clean_j ...
随机推荐
- 3.RabbitMQ系列之消费者
1. 编写消费者 @Component @RabbitListener(queues = "hello") public class RabbitReceiver { @Rabbi ...
- 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍
微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍 一.为什么会有 API Gateway 网关 随着微服务架构的流行,很多公司把原有的单 ...
- 《吐血整理》高级系列教程-吃透Fiddler抓包教程(30)-Fiddler如何抓取Android7.0以上的Https包-番外篇
1.简介 通过宏哥前边几篇文章的讲解和介绍想必大家都知道android7.0以上,有android的机制不在信任用户证书,导致https协议无法抓包.除非把证书装在系统信任的证书里,此时手机需要roo ...
- git 多个commit 如何合并
git 多个commit 如何合并 本篇主要介绍一下 git 中多个commit 如何合并, 因为commit 太多 会导致提交记录混乱, 所以有时候会把多个commit 合并成一个 保持提交记录干净 ...
- 云原生之旅 - 5)Kubernetes时代的包管理工具 Helm
前言 上一篇文章 [基础设施即代码 使用 Terraform 创建 Kubernetes] 教会了你如何在Cloud上面建Kubernetes资源,那么本篇来讲一下如何在Kubernetes上面部署应 ...
- python渗透测试入门——取代netcat
1.代码及代码讲解. 实验环境:windows10下的linux子系统+kali虚拟机 import argparse import socket import shlex import subpro ...
- git pull与git pull --rebase
aliases: [] tags: [git] link: date: 2022-08-30 目录 git pull --rebase 等效命令 总结 参考文章 git pull --rebase 在 ...
- Vue+Go前端后端一体化 企业级微服务网关项目
Vue+Go前端后端一体化 企业级微服务网关项目(~11) 课程目录: 第1章 拒绝培训机构烂大街项目,冲刺Offer首选[Vue+Go,稀缺组合,赶快上车!]1-1 摒弃千篇一律项目,选我:前后端一 ...
- Halo 主题 Redemption 首发版
Redemption 一款专注阅读.写作的 Halo 博客主题.主要设计思想即是专注阅读.写作,是一款极简类型的博客主题. Redemption 部分设计灵感借鉴 Halo 博客 Zozo 主题,感谢 ...
- MySQL进阶实战6,缓存表、视图、计数器表
一.缓存表和汇总表 有时提升性能最好的方法是在同一张表中保存衍生的冗余数据,有时候还需要创建一张完全独立的汇总表或缓存表. 缓存表用来存储那些获取很简单,但速度较慢的数据: 汇总表用来保存使用grou ...