Float比较大小

2023-11-04

目录

 

起因

结论

科学计数法

十进制转二进制

整数

基本

二进制科学计数法

总结

小数

基本

二进制科学计数法

总结

IEEE754标准存储

基本


起因

在阅读《阿里巴巴开发手册》时发现了一句话:

【强制】浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断。

说明:浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。二进制无法精确表示大部分的十进制小数,具体原理参考《码出高效》 。

结论

浮点数有精度问题,不适用于比较大小或比较相等性的逻辑;

科学计数法

假如一个数字:1234,用科学计数法来表示就是:1.234 * 10^3,其中10叫做基数,3叫做指数/阶码/阶,1.234叫做尾数;

因此,假如在某个系统中,基数是固定的,那么只需计算尾数、指数即可,而计算机系统,针对浮点数就是采用这种方式,其大致流程:

①先把十进制数字转换成二进制数字;

②再把二进制数字转换成二进制科学计数法;

③尾数必须以1开头;

十进制转二进制

整数

基本

由于是二进制,因此,十进制整数转二进制则是除以2,余数则是按照从低位往高位依次排序,举个例子,十进制数字11,转二进制:

第一次11除以2,商5,余1

这次把最低位筛选出来,最低位不足2进位

第二次5除以2,商2,余1

把次高位筛选出来

第三次2除以2,商1,余0

把次高位筛选出来

第四次1除以2,商0,余1

把次高位筛选出来

十进制转二进制,就是不断除以2,每一次筛选出低位,一直筛选到最高位,直到0除以2商为0出现;

二进制科学计数法

十进制:11

二进制:1011

二进制科学计数法:1.011 * 2^3

总结

用是否除以2是否有余数来分类,整数分为2大类:偶数、奇数;
因此,奇数无非就是最低位为2^0而已,因此,无论整数多大,也无论是偶数还是奇数,二进制均可以精确表达;

小数

基本

二进制整数取值是:1-2-4-6-8-...-正无穷大,因为是2进制,高位是低位的2倍,从低位到高位依次为:1-2-4-8-16-正无穷,所以,整数唯一能确定的就是最低位;

二进制小数就有点尴尬,由于高位是低位的2位,从高位到低位依次为:0.5-0.25-0.125-正无穷小,所以,小数唯一能确定的就是最高位,这里有个问题,小于最高位只能表示为0.5,那0.1/0.2/0.3/0.4/0.6/0.7/0.8/0.9这类小数转3二进制的时候就会出现死循环的情况,例如:

以0.9举例来说明:

0.9*2=1.8,取整数部分1

 

0.8*2=1.6,取整数部分1

 

0.6*2=1.2,取整数部分1

 

0.2*2=0.4,取整数部分0

 

0.4*2=0.8,取整数部分0

 

0.8*2=1.6,取整数部分1

 

又是下一轮循环

 

那十进制0.9转二进制,约为:0.111001

二进制科学计数法

十进制:0.9

二进制:0.111001

二进制的科学计数法:1.11001 * 2^(-1)

总结

小数部分是从0.5除以2开始,所以,像是0.1/0.2/0.3/0.4/0.6/0.7/0.8/0.9根本没法精确表达,因此,小数在计算机中存储的时候,会涉及到精度损失问题;

IEEE754标准存储

基本

JAVA中float占4个字节,共32位,其存储遵循IEEE 754标准:

第31位:符号位,正负号,负数时为1,正数时为0;

第30位:指数符号位,为正为1,否则为0;

第23-29位:指数位,二进制科学计数法指数部分加上偏移量的二进制表示;

第0-22位:尾数部分,只取小数点后面的尾数,因为前面肯定是1,不需要保存;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Float比较大小 的相关文章

  • 使用 Maven 生成 Eclipse 项目文件

    当我尝试使用生成 Eclipse 项目文件时mvn eclipse eclipse我收到以下错误 插件管理器执行目标时出现内部错误 org apache maven plugins maven eclipse plugin 2 9 SNAP
  • JNA - EnumProcessModules() 未返回所有 DLL?

    我试图从游戏中读取坐标 当我在通过 OpenProcess 接收的 HANDLE 上使用 ReadProcessMemory 以及我在 CheatEngine 中找到的内存时 效果非常好 例如 如果我知道正在运行的进程中的浮点值是0x5AB
  • Java 字符串哈希码缓存

    字符串不变性的优点之一是哈希码缓存以实现更快的访问 在这种情况下 如何处理具有相同哈希码的字符串的缓存 在这种情况下它真的能提高性能吗 在这种情况下 如何处理具有相同哈希码的字符串的缓存 被缓存的是字符串的哈希码 它被缓存在私有的int字符
  • Java中RandomAccessFile的并发

    我正在创建一个RandomAccessFile对象通过多个线程写入文件 在 SSD 上 每个线程都尝试在文件中的特定位置写入直接字节缓冲区 并且我确保线程写入的位置不会与另一个线程重叠 file getChannel write buffe
  • 检查发送到网页的请求数

    我正在编写一个 Java 多线程应用程序 它可以访问不同 Web 服务器的数百万个 有时甚至数十亿个 URL 这个想法是检查这些 URL 是否给出有效的 200OK 响应或 404 其他代码 我如何知道我的程序是否不会在他们的服务器上造成高
  • 通过 html tidy 提供渲染 jsp 页面

    我有一个在 Glassfish 上运行的 Java 项目 它会呈现一些难看的 HTML 这是使用各种内部和外部 JSP 库的副作用 我想设置某种渲染后过滤器 通过 HTMLTidy 提供最终的 HTML 这样源代码就很好且整洁 有助于调试
  • 使用正则表达式验证输入字符串是否为 0-255 之间的数字

    我在将输入字符串与正则表达式匹配时遇到问题 我想验证输入数字在 0 255 之间并且长度最多应为 3 个字符 代码工作正常 但当我输入 000000 至任意长度时 显示 true 而不是 false 这是我的代码 String IP 000
  • 初始堆大小无效。无法创建Java虚拟机

    我遇到了下一个问题 我尝试通过startup bat手动启动Tomcat 但似乎没有显示任何结果 然后我尝试运行shutdown bat 控制台显示如下 D apache tomcat 7 0 35 bin gt startup bat U
  • 从字符串生成密钥?

    我需要从字符串生成一个密钥 以便我始终可以从同一字符串创建相同的密钥 具体来说是一个Key对象 这样我就可以用它来创建Cipher进而创建SealedObject 这在 Java 中可行吗 我应该考虑什么类 方法组合才能做到这一点 对于 A
  • 使用 Hibernate Dialect 设置表字符集/排序规则?

    我使用 Hibernate MySQLInnoDB Dialect 来生成 DDL hibernate cfg xml
  • AffineTransform.rotate() - 如何同时缩放、旋转和缩放?

    我有以下代码 它可以完成我想要绘制一个上面有一些棋子的棋盘的 第一部分 Image pieceImage getImage currentPiece int pieceHeight pieceImage getHeight null dou
  • net.sf.jasperreports.engine.JRRuntimeException:java.io.IOException:无法读取字体数据

    我正在尝试通过 JasperReport 创建 PDF 报告 但读取字体数据时出现问题 我有 jasperreports extension properties 和 ClassPath 中的相关 TTF 文件 这是错误 java io I
  • 如何导入 Java 密钥库中现有的 X.509 证书和私钥以在 SSL 中使用?

    我在 ActiveMQ 配置中有这个
  • 为什么下面代码的输出是Thread[main,5,main]

    public class test1 public static void main String args TODO Auto generated method stub Thread t Thread currentThread Sys
  • vm 参数中的 -D 是什么,它表示为什么我们必须在 vm 参数中始终指定 -D

    vm 参数中的 D 是什么 它表示为什么我们必须在 vm 参数中始终指定 D 有什么标准吗 如果是 那是什么以及指定的位置 D 设置当前运行的 java 程序可以访问的属性值 它允许程序员设置程序运行所需的值 但程序不知道这些值是什么 因此
  • Servlet 调度程序当前不可用

  • Java 不可变对象 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在学习不变性的概念 据我了解 一旦创建对象 不可变对象就无法更改其值 但我不明白不可变对象的以下用途 They are 自动是线程
  • Java LRU 缓存使用 LinkedList

    堆栈溢出的新手 所以请不要介意我以菜鸟的方式问这个问题 我正在尝试使用链表实现 LRU 缓存 我在这里看到了使用 linkedHashMap 和其他数据结构的其他实现 但对于这种情况 我正在尝试使用链表创建最佳优化版本 正如我在技术期间被问
  • 更新分页。是否可以?

    他们是否存在一些方法来处理更新分页 例如我有 100 行类型 Id private Integer id Column private boolean flag Column private Date last 一开始它们看起来像 id f
  • Lucene/Hibernate 搜索锁定异常

    我使用 Hibernate Search 在 Web 应用程序上索引和全文搜索项目 没有问题 来自我的 pom xml

随机推荐

  • opencv学习(十五)之图像傅里叶变换dft

    在学习信号与系统或通信原理等课程里面可能对傅里叶变换有了一定的了解 我们知道傅里叶变换是把一个信号从时域变换到其对应的频域进行分析 如果有小伙伴还对傅里叶变换处于很迷糊的状态 请戳这里 非常通俗易懂 而在图像处理中也有傅里叶分析的概念 我这
  • chromecast投屏_谷歌Chromecast与安卓Miracast投屏技术

    Win10的无线连接显示器用的就是Miracast 安卓Miracast投屏技术 Miracast是WiFi联盟推出来的标准 但这个标准似乎并没有对兼容性作详细的要求 于是 很多电视厂商都基于Miracast 魔改出了自家的投屏技术 例如现
  • 几个排序理解

    快速排序 快速排序是对冒泡排序的一种改进 通过一趟排序将要排序的数据分割成独立的两部分 其中一部分的所有数据都比另一部分所有的数据都要小 然后再按此方法对这两部分数据分别进行快速排序 整个排序过程可以递归进行 以此达到整个数据变成有序序列
  • 提取json字符串中指定格式中的参数值

    直接上代码 import java util ArrayList import java util regex Matcher import java util regex Pattern public class TestDemo pub
  • Linux ./configure --prefix命令

    源码的安装一般由3个步骤组成 配置 configure 编译 make 安装 make install 具体的安装方法一般作者都会给出文档 这里主要讨论配置 configure Configure是一个可执行脚本 它有很多选项 使用命令 c
  • 局域网访问本地localhost-VS2015调试WebService

    两点步骤 一 配置IP 二 VS管理员启动 配置ip 可以自定义IP 或者用自动分配的IP cmd ipconfig VS运行右键 显示所有应用程序 打开配置文件 在
  • 【css学习】使用css3中的var实现主题切换

    一 首先搭建基础的页面结构
  • Spring cloud项目扩展(二)项目集成redis和辅助工具hutool

    最近看到了一个很好用的集成开发工具 里面有很多工具类 可以提高开发效率 官方文档请看 https hutool cn docs 下面主要介绍一下在我们项目中加入工具并且通过这个工具使用redis 话不多说 直接开始 1 在我们原有的项目的项
  • 2021-05-05

    实训3 信息加密与哈希函数 实验目的 理解加密系统的概念 掌握经典加密的主要方法 理解混淆与扩散的概念 掌握DES加密的主要方法 了解非对称加密的重要意义 掌握RSA加密算法的主要思想与使用方法 理解数字签名的作用及生成方法 实验准备及注意
  • java声明方法抛出的异常

    java声明方法抛出的异常 TestExceptions java import java io 异常 public class TestExceptions public static void main String args void
  • 贵阳人文科技学院新颖的计算机毕业设计题目大全50例

    最近要准备毕业设计了 不会选题 希望可以帮忙给一些毕业设计题目 我整整花了一周把之前做的答辩通过的毕业设计成品进行整理如下列表 计算机科学技术毕业设计题目推荐1 10题 1 Springboot美食网站92nn7 2 Springboot基
  • Adb connection Error:远程主机强迫关闭了一个现有的连接

    小编遇到这个烦人的问题 总是一直报错 浏览了许多网页 总结了以下几种解决方法 这些都是转载加上自己的见解 这里本人是用最后一种搞定的 不过有时候需要进入paltform tools目录下 因为没有PATH路径 注意这种方法需要启动虚拟记得就
  • Stable Diffusion公司重磅开源大语言模型StableLM,又爆火了!

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 点击进入 gt 计算机视觉 微信技术交流群 金磊 发自 凹非寺转载自 量子位 QbitAI 万万没想到 以文生图著名的Stable Diffusion 也入局了大语言模
  • Java String 字符串 截取保留小数点后两位

    截取保留小数点后两位 public static String dealRateStr String rateStr int i rateStr indexOf 如果没有小数点不 if i 1 return rateStr 00 获取小数点
  • Java设计模式:23种设计模式全面解析,墙都不扶就服你

    命令模式 将命令请求封装为一个对象 使得可以用不同的请求来进行参数化 迭代器模式 一种遍历访问聚合对象中各个元素的方法 不暴露该对象的内部结构 观察者模式 对象间的一对多的依赖关系 仲裁者模式 用一个中介对象来封装一系列的对象交互 备忘录模
  • 关于定时任务简单小脚本

    1 每4小时备份一次 etc 目录至 backup目录中 保存的文件名称格式为 etc yyyy mm dd HH tar xz crontab e 进入编辑模式 tar JcPf创建文档并保存为 xz格式 0 4 tar JcPf bac
  • 深入理解数据结构——图

    include
  • SAC(Soft Actor Critic)学习记录

    SAC Soft Actor Critic 学习记录 基本介绍 SAC Soft Actor Critic 算法在近年来受到了许多的关注 得到了不少深度强化学习研究者的好评 这篇文章主要包含的内容有SAC算法的理论分析和核心代码实现 与许多
  • ProGan,关键创新在于渐进式训练

    2018年 NVIDIA首次用ProGAN解决了这一挑战 研究人员一直无法生成高质量的大图像 例如1024 1024 ProGAN的关键创新在于渐进式训练 它首先用极低分辨率的图像 如4 4 训练生成器和鉴别器 然后每次增加一个更高分辨率的
  • Float比较大小

    目录 起因 结论 科学计数法 十进制转二进制 整数 基本 二进制科学计数法 总结 小数 基本 二进制科学计数法 总结 IEEE754标准存储 基本 起因 在阅读 阿里巴巴开发手册 时发现了一句话 强制 浮点数之间的等值判断 基本数据类型不能