【JAVA面试题】为什么会出现4.0-3.6=0.40000001这种现象?

2023-11-03

这种舍入误差的主要原因是:
浮点数值采用二进制系统表示, 而在二进制系统中无法精确地表示分数 1/10。
这 就好像十进制无法精确地表示分数 1/3—样。
如果在数值计算中不允许有任何舍入误差, 就应该使用 BigDecimal类。

浮点数值不适用于无法接受舍入误差的金融计算中。
例如,命令 System.out.println ( 2.0-1.1 ) 将打印出 0.8999999999999999, 而不是人们想象的 0.9。

为什么二进制无法精确表示1/10

其实跟数位表示法有关,比如十进制的情况下:
123,相当于
1*10^2+2*10^1+3*10^0(值*进制^位置,个位0,十位1,百位2)
同理:1/10由二进制表示小数的时候只能够表示能够用1/(2^n)

例如:
0.5能够表示,因为它可以表示成为1/2
0.75也能够表示,因为它可以表示成为
1/2+1/(2^2)
0.875也能够表示,因为它可以表示成为1/2+1/(2^2)+1/(2^3)
0.9375也能够表示,因为它可以表示成为1/2+1/(2^2)+1/(2^3)+1/(2^4)
但是0.1不能够精确表示,因为它不能表示成为1/(2^n)的和的形式


扩展:

大数值

如果基本的整数和浮点数精度不能够满足需求, 那么可以使用java.math 包中的两个 很有用的类:Biglnteger 和 BigDecimal 这两个类可以处理包含任意长度数字序列的数值。 Biglnteger类实现了任意精度的整数运算, BigDecimal 实现了任意精度的浮点数运算。

使用静态的 valueOf方法可以将普通的数值转换为大数值:

Biglnteger a = Biglnteger.valueOf(100); 

遗憾的是,不能使用人们熟悉的算术运算符(如:+ 和 *) 处理大数值。
而需要使用大数 值类中的 add 和 multiply 方法。

Biglnteger c = a.add(b); // c = a + b 
Biglnteger d = c.nultipiy(b.add(Biglnteger.valueOf(2))); // d = c * (b + 2)

注释:

与 C++ 不同, Java 没有提供运算符重载功能。程序员无法重定义 + 和 * 运算 符, 使其应用于
BigInteger 类的 add 和 multiply 运算。Java 语言的设计者确实为字符串的连接重载了 + 运算符,但没有重载其他的运算符,也没有给 Java 程序员在自己的类中重载运算符的机会

 

 


学习参考:

https://blog.csdn.net/qq_40164190/article/details/105338777

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

【JAVA面试题】为什么会出现4.0-3.6=0.40000001这种现象? 的相关文章

随机推荐

  • 电脑显示DNS服务器没检测到,连网时出现"该设备或资源(DNS 服务器)没有检测到有响应",怎么办?...

    连网时出现 该设备或资源 DNS 服务器 没有检测到有响应 怎么办 卡饭网 梦在深巷 2016 05 05 11 23 15 小编整理了以下2种解决方法大家可以参考以下 方法一 有可能是由于无线网络连接里面的DNS服务器错误 导致的网卡断网
  • 自动化遍历-appcrawler

    下载appclawler 下载地址 https pan baidu com s 1dE0JDCH list path 2F 查看帮助文档 java jar appcrawler 2 4 0 jar with dependencies jar
  • JS-ES6类

    使用js的class需注意以下几点 1 通过class关键字创建类 类名我们还是习惯性定义首字母大写 2 类里面有个constructor函数 可以接受传递过来的参数 同时返回实例对象 3 constructor 函数只要new生成实例时
  • seq2seq

    我的书 淘宝购买链接 当当购买链接 京东购买链接 seq2seq是通用编码器 解码器框架 encoder decoder framework 可以用在机器翻译 文本摘要 会话建模 图像描述 源码 https github com googl
  • 【编译原理】flex实现词法分析器

    flex自动实现词法分析器 FLEX 与 BISON 的使用 FLEX介绍 Flex是一个生成词法分析器的工具 它可以利用正则表达式来生成匹配相应字符串的C语言代码 其语法格式基本同Lex相同 单词的描述称为模式 Lexical Patte
  • 项目中好用的方法

    1 过滤 数组子项是对象的 对象有重复的 let arr res data filter function item index self return self findIndex el gt el applyPerson item ap
  • jsp 不能识别 el 表达式 的解决方法

    在以前使用EL表达式的时候 在JSP页面直接使用就可以了 但昨天我在做项目的时候在JSP页面上的EL表达式不能被识别 如 loginForm username 在页面上还是显示 loginForm username 后来我在JSP头上加上红
  • java面向对象----封装 && 构造器

    目录 封装和隐藏 为什么需要封装 信息的封装和隐藏 四种访问权限修饰符 构造器 构造方法 构造器的特征 语法格式 构造器重载 构造器重载举例 属性赋值过程 JavaBean UML类图 关键字 this this是什么 使用this 调用属
  • 抠图算法Background Matting:The world is your green screen

    论文地址 https arxiv org abs 2004 00626 代码 https github com senguptaumd Background Matting 背景介绍 抠图是照片编辑和视觉效果中使用的标准技术 在现有的抠图算
  • Python之浮点型

    python默认的是17位小数的精度 不支持32bit的单精度浮点数 如果程序需要精确控制区间和数字精度 可以考虑使用numpy扩展库 一 单精度和双精度的区别 内存不同 单精度浮点数占用4个字节 32位 存储空间 符号位1位 阶码8位 位
  • 【MySQL安装过程中显示ddl文件缺失】

    写在前面 每个人都遇到过 无法找到 dll文件 的消息弹窗 各位 这个问题终于可以解决了 在这里你可以找到电脑上最常丢失或损坏的文件 自由下载 无任何费用 1 问题描述 安装MySQL过程中遇到的问题 如图 这些是同一类问题 都是由于缺少
  • Go导入本地包

    举例来说项目文件结构如 C go mod go sum main go models User go 如果想要再main go中导入models包 那么首先需要在go mod中配置 则可以用 这种方式来导入models中的文件
  • 【读书笔记】周志华 机器学习 第五章 神经网络

    第五章 神经网络 1 神经元模型 2 感知机和多层网络 3 误差反向传播算法 4 局部极值点和鞍点 5 其他神经网络 6 参考文献 1 神经元模型 在生物神经网络中 一个神经元A与其他神经元相连 当它兴奋时 会向相连的神经元B发送化学物质改
  • CTFHUB-Refer注入

    Referer Referer 指当前请求的URL是在什么地址引用的 例如在www a com index html页面中点击一个指向www b com的超链接 那么 这个www b com的请求中的Referer就是www a com i
  • 区块链入门笔记(一)区块链概括

    区块链入门 李永乐老师的两个视频可以快速帮助入门区块链 1 比特币和区块链啥原理 矿机挖矿咋回事 2 比特币交易如何防伪 私钥公钥地址啥意思 比特币发展历史 在2008年之前 主要研究是比特币的基础例如数据加密 分布式系统等等 1 中本聪在
  • Valve.VR.SteamVR_AutoEnableVR_UnityPackage.Update () (at Assets/SteamVR/Editor/SteamVR_AutoEnableVR_

    unity 中导入 Steam Vr puls 报错 Valve VR SteamVR AutoEnableVR UnityPackage Update at Assets SteamVR Editor SteamVR AutoEnable
  • 适配ios13

    更新Xcode之后 新项目需求 新建项目发现多了如图1所示两个新的文件SceneDelegate h和SceneDelegate m 运行之后发现黑屏 无论是真机还是模拟器都不行 换到iOS12的手机上则可以正常运行 查看官方文档 Scen
  • Charge IC logic Q&A

    Q Q4 关断有哪些影响 A 1 充电停止 2 Vbat 到 Vsys 通路被断开 Vbus 到 Vsys 通路不受影响 Q Q4 可能被打开的情况 A 1 手机时 shipmode 模式时插入充电器 2 清除 BATFET DIS 标志位
  • pytorch查看网络模型变量以及对应的尺寸

    今天看代码发现 自己对于网络中需要更新的参数并不是很熟悉 然后百度发现了这个方法 记录一下 在自己定义的模型下面加入这一行就可以查看了 for name param in model named parameters print name
  • 【JAVA面试题】为什么会出现4.0-3.6=0.40000001这种现象?

    这种舍入误差的主要原因是 浮点数值采用二进制系统表示 而在二进制系统中无法精确地表示分数 1 10 这 就好像十进制无法精确地表示分数 1 3 样 如果在数值计算中不允许有任何舍入误差 就应该使用 BigDecimal类 浮点数值不适用于无