【Java】Java中两个float计算得出错误结果

Java中double类型下出现精度计算错误情况下出力方法 Java中的简单浮点数类型float和double不能够进行运算,因为大多数情况下是正常的,但是偶尔会出现如上所示的问题。这个问题其实不是JAVA的bug,因为计算机本身是二进制的,而浮点数实际上只是个近似值,所以从二进制转化为十进制浮点数时,精度容易丢失,导致精度下降。   要保证精度就要使用BigDecimal类,而且不能直接从double直接转BigDecimal,要将double转string再转BigDecimal。也就是不能使用BigDecimal(double val) 方法,你会发现没有效果。要使用BigDecimal(String val) 方法。具体例子如下所示。 立即下载

Java中两个float计算



问题的产生

今天同学问了我一个问题,给了一段代码,问运行结果:
这里写图片描述
第一眼看上去感觉就是0.8啊,没毛病,可是要是这么简单的题怎么会问我呢,感觉是个陷阱啊,这时候想起来,浮点数的存储不是精确的,但是依然得不出答案,于是上IDE编译运行了一遍。
这里写图片描述
结果:0.79999995
其实不只是减法,加法也可能发生这种情况,可以参考 这里。是不是很奇怪呢,让我们一起去探索究竟。

原因

浮点数在内存中是按照IEEE754标准进行存储的,详细的介绍请Google或者百度,或者参考这篇文章 得到浮点数的二进制。
原因就是计算机内部是通过二进制也就是0和1来存储数据的,浮点数也不例外,但是有些浮点数是无法精确存储的,看了上面那篇文章应该可以理解,只有由2的幂组成的数才可以精确存储。

2.0f在内存中可以准确的存储,这是2.0f的二进制存储图:
这里写图片描述

1.2f就无法精确的存储:
这里写图片描述

经过换算可以得到1.2f在内存中存储的其实是 1.2000000476837158203125E0
这里就可以体现出浮点数是在一定精度内还是准确的。

因为1.2f后面还有很多多余的数字,进行减法就相当于计算:
2.0 - 1.2000000476837158203125E0
它的结果就是0.7999999523162842
进行保留后就得到了我们输出的结果0.79999995

如何解决

通过java.math包中提供的BigDecimal类可以解决此类问题。
这里写图片描述

也一定要使用BigDecimal类中参数类型为String的构造函数
这里写图片描述

不然还是的不到正确的结果:
这里写图片描述

这是因为以String为参数的构造函数内部是采用字符串处理的,而以浮点数为参数,内部还是通过double类型实现,所以还是会出现精度损失的问题。

使用Java的到浮点数的二进制

得到浮点数的二进制这篇文章是使用C语言得到浮点数的二进制,使用java比C语言要简单,因为有方法可以调用。

可以使用Float类的静态方法floatToIntBits()或者floatToRawIntBits():
这里写图片描述

floatToIntBits()和floatToRawIntBits()的区别就在于当参数是NaN,floatToRawIntBits 不压缩所有将 NaN 编码为一个“规范”NaN 值的位模式。
这里写图片描述

If the argument is NaN, the result is the integer representing the actual NaN value. Unlike the floatToIntBits method, floatToRawIntBits does not collapse all the bit patterns encoding a NaN to a single “canonical” NaN value.

Linux安装Docker(图文解说详细版) 第一步,下载docker 下载地址: https://download.docker.com/linux/static/stable/x86_64/ 这次的演示我们使用docker-18.06.3-ce.tgz 这个版本 第二步,上传到云服务器上面 使用rz命令上传或者fltp工具进行上传 第三步,解压文件 第四步,将解压出来的docker文件复制到 /usr/bin/ 目录下 这么做的目的是将docker交给linux自己去管理,类似spring中的ioc(猜测,非正经知识) cp docker 阅读详情

相关推荐

IMA知识库:从0到1的架构设计与实践

本文探讨了AI时代知识库系统的架构设计与演进路径。通过分析知识入库、知识管理和知识应用三大核心业务流程,提出了应对数据多样性、处理标准化、流量洪峰等挑战的解决方案。重点介绍了基于统一数据格式的解耦设计、异步处理架构、服务拆分策略以及权限安全体系,构建了一个稳定、高效且可扩展的知识库系统。文章强调优秀架构需要持续演进,通过识别薄弱点不断优化,最终实现技术方案与业务需求的平衡。

lovehu6686的博客 1738

解决两个float类型的数值相减,精确度不准确的问题

开发工作中对一些数据要求精确度,往往无法确保精度不丢失,就像做人一样,有时明知道有些事不文明,但还是有些人不在乎,越过道德底线,变得在平常人眼中显得突兀!

sunshine5234的博客 1万+

计算机模拟爆破过程,基于LSDYNA岩石爆破模拟建模分析

原标题:基于LSDYNA岩石爆破模拟建模分析 Ls Dyna岩石爆破模拟仿真作者:dyna_focus擅长领域:dyna/abaqus/hypermesh一、 数值模型的建立1.1 单元及算法的选择岩石,炸药,空气都采用solid164实体单元。岩石采用常应力实体单元,该种单元属于纯粹的lagrange算法,该种算法单元网格附着在材料上,随着材料的流动而产生单元网格的变形,但是在结构变形巨大时,有...

weixin_29494379的博客 7317

java float小数相减不准确

最近程序发现个bug,测试人员告诉我优惠券为0.1元时,为什么显示优惠券了0元。一直很纳闷呢,为什么别的场景都正常,这时出现bug。 我们的计算公式: 优惠券了的钱 = 原价 - 优惠后的价格 原价为 43.0, 优惠后的价格为 42.9 43.0 - 42.9 = 0.0999… 只保留一位小数,后面的直接截断,不四舍五入, 结果为0.0,导致bug。那么怎么来解决呢? 将 float型

tihi的博客 5224

k8s架构、工作流程、集群组件详解

Kubernetes(简称K8s,是因为 k 和 s 之间有八个字符)是一个开源的容器编排平台,用于管理云平台中多个主机上的容器化应用程序。它提供了一种机制,用于自动化部署、扩展和管理容器化应用程序的集群。Kubernetes的目标是让部署容器化应用程序变得简单高效。它提供了应用程序部署、规划、更新和维护的基本机制,同时具备强大的扩展性和可靠性。Kubernetes采用主从设备模型(Master-Slave架构),其中Master节点负责核心的调度、管理和运维任务,而Slave节点负责运行应用程序的容器。

qq_51545656的博客 4382

STM32 AFIO时钟开启时机与复用功能解析

在嵌入式系统开发中,GPIO复用是微控制器外设配置的核心技术之一。通过复用功能,单个物理引脚可以动态切换不同功能模式,如USART通信或普通IO。其实现原理依赖于芯片内部的时钟树架构和寄存器配置机制。AFIO(Alternate Function I/O)模块作为STM32的特色设计,专门处理引脚重映射、外部中断配置等高级功能。正确理解复用功能与AFIO时钟的关系,能显著提升嵌入式开发效率,避免资源浪费。本文以STM32为例,结合引脚重映射和USART配置等典型场景,详解AFIO时钟的实际应用规范与优化实践

weixin_42389113的博客 579

Float中的那些常量 Infinity、NaN

在 Java 计算中,肯定会使用各种基本数据类型,进行加减乘除等操作。但是假如哪一天,你发现一个函数给你返回了一个float结果,你打印出来后却发现不是小数,而是Infinity或NaN这种东西,你可能就一脸黑人问号了。 这两个值确实是 Java 提供的数值,一个返回float的函数给你返回这两个值也是没有任何问题的。那这两个值各代表什么意义呢,下面给出答案

李斯维的博客空间 4360

AutoCAD中圆弧折线化方法与实现

在AutoCAD中,圆弧折线化是将圆弧曲线转换为由一系列线段组成的折线曲线的过程。本文将介绍如何使用LISP编写代码来实现圆弧折线化,并提供相应的源代码。上述示例代码将生成一个以坐标原点为圆心、起点为(5.0, 0.0, 0.0)、终点为(0.0, 5.0, 0.0)、半径为5.0、角度为90度的圆弧的折线表示。通过使用上述的LISP代码,你可以在AutoCAD中实现将圆弧转换为折线的功能。你可以根据需要修改代码中的参数来适应不同的圆弧转换需求。函数,并传入圆弧的起点、终点、圆心、半径和角度参数。

VcuOcaml的博客 1418

Java两个浮点型数字加减乘除的问题

浮点数加减精度问题

qq_38030465的博客 1238

23、电器元件符号及封装大全(2025版本)

总计28类电器元件符号和封装。

XU157303764的博客 2659

【AI黑话日日新】什么是算力调度?

算力调度 = 在有限资源下,把任务智能分配到最合适的计算节点,实现效率、成本、稳定性最优。更完整的定义:算力调度是对 CPU、GPU、内存、网络、存储等异构资源进行统一抽象、感知、决策、分配、监控与自愈的全生命周期管理,是分布式系统的“智能管家”。算力调度不是玄学,它是资源管理 + 算法 + 工程实践的结合。先懂概念 → 再玩工具 → 再写策略 → 再优化算法从单机到集群,从CPU到GPU,从离线到在线,循序渐进未来AI与算力网络时代,算力调度是性价比最高、最稀缺、最长期吃香的技术方向之一。

专注:太空算力、AI infra、异构调度、大模型成本工程 268

java float 运算_java float除法的问题

展开全部您好,1、整数的除法:32313133353236313431303231363533e78988e69d83313333373865360做除数抛运行时异常;两整数商会做取整运算,Float或Double与一个整数做除法运算,则商位Float或者Double类型,例如:System.out.println("------------Int相关除法----------");System.o...

weixin_33970994的博客 5710

STM32开发 -- 4G模块开发详解(1)

这部分一直再看,资料都已经整理好了,但是一直没有汇总。接下来就详细的看一下,GSM这部分是怎么实现的。

不积跬步,无以至千里 5万+

精确计算时,不要使用float或double

照例,还是来一段Effective Java的内容。内容大家应该已经都熟悉,不过还是发现很多新人完全不清楚,所以拿来共享一下。 一、病例: System.out.println(1.03 - 0.42); // 0.6100000000000001 System.out.println(1.00 - 9 * 0.10); // 0.09999999999999998 又比如,每个单价0.10元,0.20元,0.30元,0.40元……,每种比前一种多0.10元。每样买一个,1元钱能买几个,找零多少 pu

Aphadite的博客 833

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java对大于10000000f的float类型数计算时,计数结果丢失数据精度的问题

我在java里使用float类计算时出现下面问题: double number1=10000000.00f-100.00f; System.out.println(number1); double number2=20000000.00f-100.00f; System.out.println(number2); double number3=100000000.00f-100.00f; ...

qq_38522268的博客 926

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

关于java float类型的比较

关于java的浮点类型处理,一般处理计算会想到使用BigDecemal,但是如果是比较呢? 可能会直接使用==,>等符号直接进行比较运算。可以执行下面的代码查看结果: public static void main(String[] args) { computer(2.00023434239f, 2.00023434233f); System.out...

lc 1189

float.equals_Java Float类equals()方法与示例

float.equals 浮动类equals()方法 (Float class equals() method) equals() method is available in java.lang package. equals()方法在java.lang包中可用。 equals() method is used to check equality or inequality of this Ob...

cumtb2002的博客 777

java中float和double的大小比较

float说明 在Java中float为单精度小数,占4个字节空间,其中1为表示符号位,8为表示指数为,剩下23位表示小数位。举个例子:1.234*1012 ,其中1.234为指数表示的小数位,12表示指数位(科学表示法中的指数学法),所以小数为23位在计算机中的大小为0~223,十进制范围则是:0~8388608,最多表示7为数小数,严格来说甚至只能表示6为的准确,因为0~223的十进制返回不...

OxuanO的博客 3038

java判断float相等_在java中判断两个浮点型(float)数据是否相等的案例

在java中判断两个浮点型(float)数据是否相等的案例,精度,判断是否,浮点数,给大家,两个在java中判断两个浮点型(float)数据是否相等的案例易采站长站,站长之家为您整理了在java中判断两个浮点型(float)数据是否相等的案例的相关内容。示例代码:public static void main(String[] args) {float a = 10.222222225f;floa...

weixin_39953578的博客 438

Java面试官:兄弟,你确定double精度比float低吗?

我有一个朋友,叫老刘,戴着度数比我还高的近视镜,显得格外的“程序员”;穿着也非常“不拘一格”,上半身是衬衣西服,下半身是牛仔裤运动鞋。 我和老刘的感情非常好,每周末我们都要在一起吃顿饭。这周,我们吃的是洛阳有名的吴家刀削面,席间他聊了一件蛮有趣的面试经历;我听得津津有味。 散席的时候,老刘特意叮嘱我把他和面试者的对话整理一下发出来,因为他觉得这段对话非常的精彩,值得推荐给更多初学Java的年轻人...

沉默王二 5万+

Java Float类的compareTo()方法与示例

浮动类compareTo()方法 (Float class compareTo() method) compareTo() method is available in java.lang package. compareTo()方法在java.lang包中可用。 compareTo() method is used to check equality or inequality for thi...

cumtb2009的博客 1406

Java double和float精度损失问题

问题 一般,我们会用float和double来存储有小数的数据,可能还会用两个浮点型数据进行计算,在某些情况下,float和double会出现精度损失,导致存储的数据或者计算结果出现误差。 举个例子 public class Test { public static void main(String[] args) { double a = 0.11; double b = 2.32; System.out.println(a + b); System.out.println(0.11

卡了个卡 3701

关于float浮点数计算精度问题的深入分析

在Java中,或者说在任何一门语言中,float和double两种类型浮点数计算的精度问题都是老生常谈了。在进行跟钱相关的计算时(毕竟是白花花的银子)的时候如果不注意这两种浮点类型往往会出现许多莫名其妙的bug且难以排查,所以我们不管见到什么一股脑全用BigDecimal算了,也是一种你好我好大家好的万金油方案。但是为什么会有浮点数误差?Java中float有效位数为7位为什么却连0.1都存不了?...

半斤米粉闯天下的博客 9799

支付价格计算中精度问题之double,float

前言 前段时间开发新的微信小程序,借此机会将老掉牙的支付模块重构,并且支持现金支付(之前都是虚拟币支付),在重构期间遇到计算上的一些精度问题,虽然数额影响非常小但是影响比较大,我觉得有必要总结以下遇到的一些问题,并且解决弄清楚他的原来,因此有下文。 先看几个现象 当我们程序中涉及到一些double或者float类型的数据,并且精度要求比较高,小数点位数比较多的时候,可能会出现一些非常奇葩的问题,我下面正对遇到的一些问题给出几个针对性的案例: 条件判断异常 System.out.println(1f

0102的博客 2474

关于Java中float double 等计算精度问题

关键字 Java 浮点数 精确计算 问题的提出: 如果我们编译运行下面这个程序会看到什么? public class Test{ public static void main(String args[]){ System.out.println(0.05+0.01); System.out.println(1.0-0.42); System.out.println(4.015*100);...

Ethanxumf的博客 432

Java中的数据类型详解——float类型

FloatTest01.java /* 关于java语言中的浮点型数据 浮点型包括: float 4个字节 double 8个字节 float是单精度 double是双精度 double更精确 比如说: 10.0 / 3 如果采用float来存储的话结果可能是:3.33333 10.0 / 3 如果采用double来存储的话结果可能是:3.3333333333 但是需要注意的是,如果用在银行方面或者说使用在财务方面,double 也是远远不够

Amlynooto的博客 9557

java 从double转换到float_关于浮点数:在Java中从double转换为float

如果我正在使用double,并将其转换为float,它如何工作? 值会被截断以适合浮点数吗? 还是舍入值不同? 抱歉,这听起来有点补救,但是我正在尝试掌握float和double转换的概念。stackoverflow.com/a/2781125/986169根据Java语言规范的第5.1.3节:A narrowing primitive conversion from double to floa...

weixin_39593354的博客 2855
上一篇: 【Spring】Bean的配置
下一篇: 【Spring】IOC容器
cflys
博客等级 码龄12年 113粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值