使用的Eclipse软件:
double a = 0.1+0.2;
double b = 0.3;
输出结果:a!=b;
double c = 0.2+0.2;
double d =0.4;
输出结果 a=b;
我手算二进制发现a和b,c和d的二进制都相同,为什么结果不同,求科普。
关注
码龄 粉丝数 原力等级 --
- 被采纳
- 被点赞
- 采纳率
已采纳
java中double二进制浮点计算问题
收起
- 写回答
- 好问题 0 提建议
- 关注问题
- 微信扫一扫点击复制链接分享
- 邀请回答
- 编辑 收藏 删除 结题
- 收藏 举报
4条回答 默认 最新
- 关注
码龄 粉丝数 原力等级 --
- 被采纳
- 被点赞
- 采纳率
threenewbee 2018-08-07 20:22关注0.1 0.2 0.3 0.4 在2进制中都是无限循环小数。它们都不能精确表示(只有0.5 0.25 0.125 ... 以及它们的组合,比如 0.75 0.3125 ...可以表示为有限小数)
它们进行四则运算的结果,就是近似值,而且会有不同的舍入误差。
所以最后结果不同很正常。
“手算二进制”没用,你怎么舍入的,计算机不一定按照你的方式(好比2/3是0.66666还是0.66667就不好说了)特别是,底层硬件不同,计算精度都不同。比如说,x87的浮点运算,虽然也是64bit的精度,但是内部的寄存器是80bit的,而sse就达不到这个精度,而gpu的fp64,精度就更差了。而jvm用的什么底层硬件指令,这个就无法由你控制了。
结论就是,不要试图用相等和不等比较浮点数,而是用差的绝对值<epslon的方式比较。
本回答被题主选为最佳回答 , 对您是否有帮助呢? 本回答被专家选为最佳回答 , 对您是否有帮助呢? 本回答被题主和专家选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏举报微信扫一扫点击复制链接分享编辑预览轻敲空格完成输入- 显示为
- 卡片
- 标题
- 链接
评论按下Enter换行,Ctrl+Enter发表内容
编辑
预览
轻敲空格完成输入
- 显示为
- 卡片
- 标题
- 链接
报告相同问题?
提交
- 2016-11-27 03:56回答 1 已采纳 /** * 十进制数转二进制数 * @param d 十进制数 * @return 十进制数转换成二进制的字符串 */ public String decimal2BinaryStr(dou
- 2021-09-30 01:01回答 2 已采纳 java里提供了各种进制数之间的转换。当你在定义一个数的时候,需要告诉编译器这个数是什么进制的(比如声明一个十六进制形式的整数,就要写成 int a = 0x2ABC这样以0x开头),编译器在计算的时
- 2021-03-10 15:20回答 3 已采纳 根据 IEEE 754 浮点“双精度格式”位布局,返回指定浮点值的表示形式,并保留 NaN 值。 第 63 位(掩码 0x8000000000000000L 选定的位)表示浮点数的符号。第 62-5
- 2021-02-12 17:59天生双下巴的博客 I want to convert a string representing the mantissa portion of a IEEE754 double.Cannot find if there is such a conversion method in Java, in order to avoid manually adding 1 + 1/2 + 1/4 + 1/8 etc.|01...
- 2022-07-23 07:50回答 1 已采纳 c.equals("头等舱") 内容相同用equals
- 2022-10-05 08:02回答 4 已采纳 我测试了下,没发现你说的是问题,你这边可以把输入逻辑和运行的错误结果发下没我帮你看下呀 public static void main(String[] args) { Sca
- 2022-05-24 12:19回答 2 已采纳 用BufferReader字符缓存流一行行读取出来。
- 2021-02-12 17:59鹤田裕志的博客 /** 二进制串"10010111.10010010" 转化为double型* double型 转化为 二进制串** 例如:"1111.11"===>15.75* 15.75===>"1111.11"*/首先 把二进制串转为double型先把输入的字符串以小数点"."为界,分为整数部分...
- 2021-06-01 03:03回答 2 已采纳 这个是有效数字的问题,他的有效数字不是根据10进制的位数,而是二进制的位数算的,double的有效数字是53位二进制,超出的部分都会被当成0 System.out.println(
- 2022-01-05 01:50回答 4 已采纳 1.main方法名字写错了,是main,不是mian2.第9号的pareeDouble写错了,是parse,不是paree3.最后的结果想保留2位小数的话,可以写成 System.out.print
- 2017-06-12 04:29回答 3 已采纳 double类型是无法精确地表示小数的,它存在舍入误差。在处理double类型数据时,有可能会出现不精确的结果。 比如 double a =0.1;实际上double中保存的是0.0999
- 2020-08-25 13:42Java二进制相关基础知识 Java语言中 byte 代表最小计量单位,byte 由 8 位 2 进制数组成。在 Java 语言规范中,定义了 Java 语言的语法、变量、类型、文法等等,而 JVM 规范主要定义 Class 文件类型、运行时数据、...
- 2021-02-12 04:21王若灵的博客 public static void main( String[] args ){// byteSystem.out.println("基本类型:byte 二进制位数:" + Byte.SIZE);System.out.println("包装类:java.lang.Byte");System.out.println("最小值:Byte.MIN_VALUE=" ...
- 2021-02-12 17:59DR阿福的博客 因为要参加软考了(当然也只有考试有这种魅力),我得了概浮点数转化为二进制表示这个最难的知识点(个人认为最难)。俺结合大量的从网上收集而来的资料现整理如下,希望对此知识点感兴趣的pfan有所帮助。基础知识:十...
- 2020-07-07 01:45dnc8371的博客 java 十六进制浮点 我如何遇到十六进制浮点数 我正在Java :: Geci中开发一种新功能,以减少代码重新格式化的可能性。 如果重新格式化,当前版本的代码将覆盖原本相同的代码。 这很烦人,因为按下重新格式化键的...
- 没有解决我的问题, 去提问
悬赏问题
- ¥15 PADS Logic 原理图
- ¥15 PADS Logic 图标
- ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
- ¥20 气象站点数据求取中~
- ¥15 如何获取APP内弹出的网址链接
- ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
联系我们(工作时间:8:30-22:00)
400-660-0108kefu@csdn.net在线客服
- 京ICP备19004658号
- 经营性网站备案信息
- 公安备案号11010502030143
- 营业执照
- 北京互联网违法和不良信息举报中心
- 家长监护
- 中国互联网举报中心
- 网络110报警服务
- Chrome商店下载
- 账号管理规范
- 版权与免责声明
- 版权申诉
- 出版物许可证
- ©1999-2025北京创新乐知网络技术有限公司