当前位置: 首页 > 知识库问答 >
问题:

为什么0.10.1==0.2?

隆向晨
2023-03-14

这关系到Java。据我所知,由于二进制表示,0.1不能用Java完美表示。那使得

0.1 + 0.1 + 0.1 == 0.3

错误的但是,为什么会这样呢

0.1 + 0.1 == 0.2

真的吗?

共有1个答案

况景龙
2023-03-14

由于二进制表示,Java无法完美地表示0.1。那就

0.1 0.1 0.1 == 0.3

假。

这并不是平等是错误的全部原因,尽管它是其中的一部分<代码>0.3也不完全是3/10。恰好0.2正好是0.1的两倍(尽管它们分别不是2/10和1/10),并且将0.1添加到自身会产生一个值,该值也是键入常量0.2时得到的值。另一方面,在操作0.1 0.1 0.1后得到的总体近似值与将0.3与3/10分开的近似值略有不同。

如果我们使用5位有效数字的十进制,您可能会惊讶于1/3*3==1不成立(1/3将计算为0.33333,乘以3将计算为0.99999,这与1不同),而1/4*4==1成立(1/4将计算为0.25,乘以4将计算为1)。

您的问题与此有点类似,但用于基数为2的计算。每一个常数和运算都是一个近似的机会。有时近似值不会发生,有时它们会发生,但会相互抵消,因此最终结果比您有权期望的更准确。对于0.1 0.1,结果不是2/10,而是与写入0.2时得到的2/10近似值相同,因此等式成立。有了0.10.10.1我们就不那么幸运了。

 类似资料:
  • 问题内容: 在Java 8中,我们有类,它奇怪地有一个方法 因此,您可能希望它实现接口,而该接口正是需要此方法,但事实并非如此。 当我想使用foreach循环遍历Stream时,我必须做类似的事情 我在这里想念什么吗? 问题答案: 人们已经在邮件列表 asked 上问过同样的问题。主要原因是Iterable也具有可重复的语义,而Stream没有。 我认为主要原因是Iterable暗示可重用性,而S

  • 这是我代码的简化版本: 是在第二次迭代后停止的协程。 是一个异步生成器,它在异步上下文管理器中生成数字。 输出为: 其实我有两个问题: 据我所知,AsyncIO将在事件循环的下一个周期中很快调用一个任务,并为执行提供了机会。但打印行(“该行未执行”)未执行。为什么?假设如果我们在

  • 问题内容: 我是一名即将毕业的计算机科学专业的学生,​​在我的整个编码生涯中,我发现很少使用枚举的实例,除了典型的情况(例如代表标准纸牌的面孔)外,还使用了枚举。 您是否知道在日常编码中使用枚举的任何巧妙方法? 为什么枚举如此重要,在什么情况下应该能够确定建立枚举是最佳方法? 问题答案: 这些是主要的论点,以及短的例子。 的情况 从Java 6开始,是一个凌乱类的示例,该类可以从使用中受益匪浅(除

  • Bootstrapping(引导) 是 Netty 中配置程序的过程,当你需要连接客户端或服务器绑定指定端口时需要使用 Bootstrapping。 如前面所述,Bootstrapping 有两种类型,一种是用于客户端的Bootstrap,一种是用于服务端的ServerBootstrap。不管程序使用哪种协议,无论是创建一个客户端还是服务器都需要使用“引导”。 面向连接 vs. 无连接 请记住,这

  • 问题内容: 在我的Web应用程序中,我在Apache Tomcat(TomEE)/7.0.37服务器上使用OpenJPA。我使用Netbeans自动生成类(“来自数据库的实体类…”和“来自实体类的会话Bean …”)。在SessionBean(例如UserFacade)上,我想获取EntityManager: 但是当我通过上述方式得到它时,我得到的是空值。当我通过: ecm不为空,还可以 我的pe

  • 问题内容: 我有Ubuntu 10.10和apache2,php 5.3.3-1和mysql 5.1。 我正在通过URL向页面传递一些值。在该页面上,如果我这样做了,那么我会看到数组的内容。但是,如果我这样做数组是空的。任何想法为什么会这样? 问题答案: 也可以尝试检查php.ini中的“ request_order” 选项: