Java浮点数float,bigdecimal和double精确计算的精度误差问题

为什么Java中的double和float存在精度问题?深入理解浮点数陷阱 理解浮点数的精度特性是开发者的必备技能。在需要精确计算的场景(如金融系统)必须使用BigDecimal,而在科学计算等场景可以合理使用浮点数。选择合适的数据类型,本质上是在精度与性能之间寻找平衡。这篇文章结合了IEEE 754标准的技术细节和Java语言的具体实现,可以帮助开发者深入理解浮点数精度问题的本质及解决方案。 阅读详情

学习到一篇博客内容,值得做一篇笔记:
建议阅读原文,本文只是粗略笔记
原文连接:
https://www.cnblogs.com/wangyt223/p/6210916.html

1.double小数转bigdecimal后四舍五入计算有误差
案例:

double g= 12.35;

BigDecimal bigG=new BigDecimal(g).setScale(1, BigDecimal.ROUND_HALF_UP);
//期望得到12.4

System.out.println(“test G:”+bigG.doubleValue());

test G:12.3

原因:

定义double g= 12.35; 而在计算机中二进制表示可能这是样:定义了一个g=12.34444444444444449,
new BigDecimal(g) g还是12.34444444444444449
new BigDecimal(g).setScale(1, BigDecimal.ROUND_HALF_UP); 得到12.3

正确的定义方式是使用字符串构造函数:
new BigDecimal("12.35").setScale(1, BigDecimal.ROUND_HALF_UP)

bigdecimal比等方法
如浮点类型一样, BigDecimal 也有一些令人奇怪的行为。尤其在使用 equals() 方法来检测数值之间是否相等时要小心。 equals() 方法认为,两个表示同一个数但换算值不同(例如, 100.00 和 100.000 )的 BigDecimal 值是不相等的。然而, compareTo() 方法会认为这两个数是相等的,所以在从数值上比较两个 BigDecimal 值时,应该使用 compareTo() 而不是 equals() 。

另外还有一些情形,任意精度的小数运算仍不能表示精确结果。例如, 1 除以 9 会产生无限循环的小数 .111111… 。出于这个原因,在进行除法运算时, BigDecimal 可以让您显式地控制舍入。 movePointLeft() 方法支持 10 的幂次方的精确除法。

与零比较:
int r=big_decimal.compareTo(BigDecimal.Zero); //和0,Zero比较
if(r0) //等于
if(r
1) //大于
if(r==-1) //小于

HFSS 3D Layout仿真PCB操作说明 本文介绍一种特别适合PCB这种叠层结构的仿真软件,HFSS 3D Layout既有操作的简便性,又有同3D软件仿真所有的精确性,仿真速度上又比3D软件快很多。 阅读详情

相关推荐

RV1126B芯片实战:如何用这款视觉处理器SoC打造你的第一个AI摄像头项目

本文详细介绍了如何利用瑞芯微RV1126B视觉处理器SoC从零构建AI摄像头项目。涵盖硬件选型、开发环境搭建、ISP配置、AI模型部署及系统集成等关键步骤,帮助开发者高效实现边缘计算方案,特别适合智能安防和工业检测应用。

dropout6artist的博客 930

Java为什么小数运算会出现精度问题

话不多说直接上Demo double a = 4.0; double b = 3.6; System.out.println(a - b); 我们可以看到运行结果是0.3999999999999999,期望结果是0.4。 原因简单来说:2进制的小数无法十分精准的表达十进制的小数,计算机在计算十进制小数运算的时候需要先转换成2进制进行计算,这个过程中出现了一些误差。 两个解决办法 办法一 使用 BigDecimal 使用 BigDecimal 进行运算,需要注意的是初始化传值的时候务必使用.

北鹤M的代码手账 2217

小龙虾 OpenClaw 安装全攻略:本地部署 AI 智能体一步到位

OpenClaw(昵称小龙虾)是一款 MIT 开源协议的本地优先 AI 智能体执行网关,支持多平台接入、本地部署,能实现自然语言驱动的设备自动化操作,区别于纯对话 AI,可直接操控系统执行实际任务,数据全程本地存储更安全。本文带来 2026 最新版 OpenClaw 安装教程,适配 Windows/macOS/Linux 全系统,新手也能一键搞定。

lujiawei00的专栏 1973

Java使用Bigdecimal的float和double精确计算的精度误差问题总结

1、float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结果出现误差。 原因:超出float精度范围,无法精确计算。 float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。 float:2^23 = 8388608,一共七位,这意味...

裸睡的鱼 2333

Cursor使用教程,有点难

Cursor Code Editor 不仅仅是一个代码编辑器,它更是一个集成了 AI 的全功能开发环境,帮助你从代码编写到优化的整个过程变得更加智能和高效。它通过内置的 AI 代码补全、错误检测和自动修复功能,大大减少了手动编写代码的负担,帮助你快速完成开发任务。同时,Cursor 还与多种前沿的 AI 大模型集成,包括 OpenAI 的 GPT-4o、Claude 3.5 和 Meta 的 Llama 3.1。

xiaofeitunAI的博客 1万+

K230+canMV开发中常见的数据类型转换参考示例

【代码】K230+canMV开发中常见的数据类型转换参考示例。

weixin_47446386的博客 67

Java 浮点数运算不准确的原因及解决方案

前言 问题 执行如下代码,你觉得会打印出什么结果? System.out.println(0.1 + 0.2); System.out.println(0.2 - 0.1); System.out.println(0.1 * 0.2); System.out.println(0.2 / 0.1); S...

DeMonnnnnn 1万+

AD22等长布线规则

本文介绍了PCB布线中实现信号线等长的详细操作步骤:1.创建网络类(NetClass),将需要等长的信号线归入同一组;2.设置高速布线规则(High-SpeedRule),定义等长容差等参数;3.进行交互式等长布线(InteractiveLengthTuning),使用蛇形线调整线长;4.实时调整与最终检查,确保所有网络满足等长要求。文中还提供了实用技巧,如使用快捷键调整蛇形线参数、为关键信号设置更严格规则等。操作需在PCB设计软件中完成,通过统一管理、规则设置和精确调整来实现信号同步传输。

whm128的博客 1557

浮点数运算不精确的问题解决和注意事项(BigDecimal)

总结:浮点数运算不精确的问题本质上是在存储的时候就不精确,这个问题会持续到即使使用到专业的工具类BigDecimal来使用时,如果仅仅只是传double类型做入参时依然会导致运算不精确,所以即使在使用BigDecimal工具类进行构造时也要使用String类型的构造函数,尽量避免使用double类型的构造函数。仅仅只是传double类型做入参时依然会导致运算不精确,所以即使在使用BigDecimal工具类进行构造时也要使用String类型的构造函数,尽量避免使用double类型的构造函数。

SSHLY3的博客 1736

【YOLOv8科研级创新】集成HS-FPN特征融合网络,让Neck模块在参数量锐减100W的同时精度跃升

打开确保模型解析器能识别HS_FPN模块。通过将HS-FPN集成到YOLOv8中,我们实现了一个“轻量级多尺度特征融合+精准检测”的目标检测模型。这个改进不仅在工程上能提升多尺度、细粒度场景的检测效果并降低部署成本,更在科研上提供了“选择性轻量级特征融合”的创新思路——这种思路可以延伸到其他检测网络(如Faster R-CNN、SSD)的Neck模块改进中,帮你在论文中打造独特的研究点。

m0_64661770的博客 137

Windows 11 安装 OpenClaw(龙虾):不用WSL、不用虚拟机、启动、使用、停止、卸载

本文详解 Windows 11 原生安装 OpenClaw(龙虾)全流程,无需 WSL 或虚拟机。涵盖环境配置、安全警示、模型接入(如通义千问)及技能初始化。提供启动、文件自动化操作、停止与卸载的完整指南,并附常见认证过期解决方案。助您快速部署本地 AI 智能体,实现电脑操作自动化,提升工作效率。

寒水馨 · 轻量级技术文档 · hanshuixin.org 899

java关于数学运算,小数运算的误差问题

float和double在计算的时候有一下小误差-----------------------------------------解决方案1:就是把小数变成int或者是long,计算完毕后可以还原float或者double类型(速度快,不消耗内存)-----------------------------------------解决方案2:java.math.BigDecimal; 使用这个类来运...

1234的博客 3497

NVIDIA Jetson之远程控制软件NoMachine安装使用

参考:https://www.bilibili.com/video/BV1cg4y1i776?t=12 0 背景

ZONGXP的博客 1万+

Java浮点数float,bigdecimal和double精确计算的精度误差问题总结

-- Java中double类型比较大小或相等的方法- https://blog.youkuaiyun.com/liuweiyuxiang/article/details/71104712 在Java中int类型数据的大小比较可以使用双等号,double类型则不能使用双等号来比较大小,如果使用的话得到的结果将永远是不相等,即使两者的精度是相同的也不可以。 float的指数范围为-127~+128,而do...

ShareUs的专栏 6234

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java浮点数double_Java浮点数float,bigdecimal和double精确计算的精度误差问题总结

1、float整数计算误差案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结果出现误差。原因:超出float精度范围,无法精确计算。float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。float:2^23 = 8388608,一共七位,这意味着最多能有7位有...

weixin_39820158的博客 484

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java浮点数误差_Java浮点数float和double精确计算的精度误差问题总结(source)

1、float整数计算误差案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结果出现误差。原因:超出float精度范围,无法精确计算。float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。float:2^23 = 8388608,一共七位,这意味着最多能有7位有...

weixin_33968957的博客 799

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java浮点数误差_Java浮点数float和double精确计算的精度误差问题总结

1、float整数计算误差案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结果出现误差。原因:超出float精度范围,无法精确计算。float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。float:2^23 = 8388608,一共七位,这意味着最多能有7位有...

weixin_29414105的博客 758

Java中关于浮点数的算术运算出现精度丢失及Java 浮点数大小比较,JAVA中的float和double的区别

Java 浮点数大小比较,浮点数计算精度丢失问题,JAVA中的float和double的区别

忆往昔的博客 2780

BigDecimal处理舍入误差的计算

float大概精确到小数点后7位,double精确位数是float的两倍。浮点数存在舍入误差,数字不能精确表示。 BegDecimal通常使用在不能产生舍入误差的计算中。 例如: import java.math.BigDecimal; public class Main{ public static void main(String[ ] args){ BigDecimal ...

weixin_43003240的博客 401

java中float double利用BigDecimal运算

java中float double利用BigDecimal运算

qq_44884300的博客 472

Java浮点数精确计算

一、出现精度失误的原因 float和double类型主要是为了科学计算和工程计算而设计的。他们执行二进制浮点运算,这是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们并没有提供完全精确的结果,所以不应该被用于需要精确结果的场合。float和double类型尤其不是和用于货币计算,因为要让一个float或者double精确地标识0.1(或者10的任何其他负数次方值)是不能的。 public static void main(String[] args) { //所...

weixin_66813230的博客 2284

java中单精度_java单精度和双精度的区别

为什么会有精度问题?计算机处理数据都涉及到数据的转换和各种复杂运算,比如,不同单位换算,不同进制(如二进制十进制)换算等,很多除法运算不能除尽,比如10÷3=3.3333.。。。。。。无穷无尽,而精度是有限的,3.3333333x3并不等于10,经过复杂的处理后得到的十进制数据并不精确,精度越高越精确。float有8位有效数字,double有16位有效数据,float和double都是到大到一定的...

weixin_35355431的博客 2045

double或者float类型加减乘除运算,避免java直接计算出现误差

/**     *     * 方法名:         calcFloatValue     * 方法功能描述:   float类型的加减乘除,避免Java 直接计算错误     * @param:     type:   加:add   减:  subtract  乘:multiply 除:divide     */    public static float  calcFloatValue...

qq_24466961的博客 6033
上一篇: leetcode58最后一个单词的长度
下一篇: mac加固app反编译apk流程
zz白龙
博客等级 码龄10年 26粉丝 138原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值