本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:

Java floats and doubles, how to avoid that 0.0 + 0.1 + … + 0.1 == 0.9000001?

我在Java中遇到以下问题-我需要以0.1f的增量在0.1f和1.0f之间进行迭代,因此我希望输出如下所示:

0.1

0.2

0.3

0.4

...

0.9

相反,当我这样做时:

for(float i = 0.1f; i < 1f; i += 0.1f)

System.out.println(i);

我懂了

0.1

0.2

0.3

0.4

0.5

0.6

0.70000005

0.8000001

0.9000001

我想这与计算机表示分数的方式有关,但是我想知道为什么会这样,以及是否有什么办法可以阻止它。

谢谢。

您可以改用双打吗?

确实,这根本不可行。 没有确切的值0.1可表示为浮点数或双精度数。

"我想知道这是为什么"-简短的答案是"舍入误差"。 要获得较长的答案,请阅读以下内容-docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html。" ...如果有什么我可以阻止的事情"-简短回答"不"。

在for循环中使用整数,以避免重复的浮点数学运算,这会增加浮点错误。

for (int i = 1; i < 10; i++)

{

float f = (float) i / 10.0f;

System.err.println(f);

}

您可以尝试以下方法:

for(int i = 1; i < 10; i++)

System.out.println(i/10f);

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

您所看到的是浮点数固有的不准确性的结果,如果您不断添加它们,这些自然就会累积,就像在发布的代码中所做的那样。 如果改为在循环中使用int,则避免进行float加法运算,因此也避免了错误累积。

为什么要投反对票?

我不是那个否决这个答案的人,但是如果我猜出来的话,因为您的输出以0.0开头,而不是0.1开头。

@rgettman啊,是的-更改了1个字符,感谢您指出。我真的希望投票者会发表评论以表明这些事情。

浮点数是二进制的,不能很好地表示小数

如果适用,则以1/8或0.125进行迭代。

for(float i =1.0f;i<10f;i+=1f)

System.out.println(i/10f);`

很丑陋,但可以在这里使用(Ubuntu AMD64 OpenJDK)

浮动我?????????

引用我自己:这很丑陋,但是在这里有效。

嗯...看起来/听起来像是我的伏都教解决方案。

引用自己:这很丑陋,但是在这里有效

...只要您继续牺牲鸡!!"它似乎行之有效",而没有清楚地理解为什么编写脆弱的,无法维护的代码。我们应该不鼓励新程序员使用这种编程方法……而不是向他们提供我们自己的伏都教编程"解决方案"以复制到他们的代码中。

精彩。如果没有可用的鸡肉,则可以替代被诅咒的鸭子。这是我提到的"但可以在这里使用(Ubuntu AMD64 OpenJDK)":我不知道它是否可以在x86上运行(并且我不在乎)。对发生的情况的理解是微不足道的:1/10在任何二进制浮点数中都无法表示,无论精度如何。我不鼓励任何人(无论有经验的人)尝试使0.1成为一个精确的浮点数..它只会起作用。我要说的是:这在指定的确切情况下有效。再多一点。

java中1和1.0_在Java中如何以0.1f增量在0.1f和1.0f之间进行迭代?相关推荐

  1. matlab如何判断矩阵中元素都大于0_在MATLAB中找到矩阵中零元素的数量

    I have a NxM matrix for example named A. After some processes I want to count the zero elements. How ...

  2. canvas java 上传截图_在Vue项目中使用html2canvas生成页面截图并上传

    使用方法 项目中引入 npm install html2canvas html代码 //html代码 js代码 // 引入html2canvas import html2canvas from 'ht ...

  3. java中引用类型_您真的了解Java中的4种引用类型吗?

    Java中提供了四个级别的引用:SoftReference,FinalReference,WeakReference和PhantomReference.在四种引用类型中,只有FinalReferenc ...

  4. Java 中关于 try、catch、finally 中的细节分析

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:God Is Coder https://www.cnblo ...

  5. word录入表单数据 java 导入系统,java导入excel | 怎么把excel中的数据批量导入到word中的表格中...

    用javascript怎么实现把excel中的数据批量导入到数据库表中 这个js不能直接实现吧 我们程序用到 先读取excel内容转换成数组 然后放到页面上 再提交表单 储存 MySql如何批量添加数 ...

  6. java中char是几个字节_Java中char占用几个字节

    在讨论这个问题之前,我们需要先区分unicode和UTF. unicode :统一的字符编号,仅仅提供字符与编号间映射.符号数量在不断增加,已超百万.详细:[https://zh.wikipedia. ...

  7. java中磁盘和内存的相互,Java:有没有磁盘和内存一样快的情况?

    我正在写一些代码来访问inverted index. 我有两个可互换的类,它们对索引执行读操作.一个从磁盘读取索引,缓冲其中的一部分.另一个将索引完全加载到内存中,作为byte [] [](索引大小约 ...

  8. java.lang类在电脑哪个位置_Java中的java.lang.Class API 详解

    且将新火试新茶,诗酒趁年华. 概述 Class是一个位于java.lang包下面的一个类,在Java中每个类实例都有对应的Class对象.类对象是由Java虚拟机(JVM)自动构造的. Class类的 ...

  9. java arrays.sort() c_正面刚算法-Java中Arrays.sort()(一)

    最近一直在看关于排序相关的算法,从O(n²)的冒泡.插入.选择到O(nlog(n))的归并.快排.再到桶排序.计数排序.基数排序.各个算法都有自己的优点和缺点,那么jdk中关于这种底层的算法是怎么实现 ...

最新文章

  1. Centos 中 TCPWrappers访问控制
  2. WPF 3D 基础学习 - 相机、裁剪、光线入门(2)
  3. ElasticSearch API实现CRUD
  4. Java Annotation(注解)使用教程
  5. cuda Memory Fence Functions
  6. G.8032协议 ERPS
  7. smarty 模板php,Smarty模板快速入门
  8. 线性代数的本质(Essense Of Linear Algebra)[2]
  9. jupyter代码字体大小_Jupyter Notebook 更改字体、字体大小、行高
  10. Spring+Spring MVC+MyBatis实现SSM框架整合详细教程【转】
  11. MATLAB——更换主题颜色
  12. 淘宝开发文档AlibcShowParams唤起淘宝的返回小把手
  13. 10个常用的JS工具库
  14. [位压] 高精度加法
  15. ubuntu网络无法连接
  16. Scrapy爬取动态页面下载图片(以抓取360图片为例)
  17. 文件管理工具,教你批量删除文件夹原名称并添加编号
  18. 《流畅的python》1.2 笔记
  19. 在M1 Mac上编译使用arm64原生go | Gopher Daily (2020.12.15) ʕ◔ϖ◔ʔ
  20. 从风险评估到应急救援,实景三维为抗震减灾提供精细化决策依据

热门文章

  1. opc读取ab的plc数据_C#读写 AB PLC 直接通过节点来读写数据 读写 AllenBradley PLC
  2. python manage.py syncdb Unknown command: 'syncdb'问题解决方法
  3. mysql中教如何拼接字段(列)值、加入运算、设置别名(非常实用)
  4. python 过滤文本中的标点符号(转)
  5. bzoj5324:[Jxoi2018]守卫
  6. #前端# 解决前端页面滑动不顺畅的问题
  7. phpcms文件所需权限
  8. 手机型号识别 手机PID UID 驱动识别 数据库包
  9. 遍历repeater中的控件的几种方式
  10. Flash与.NET的通信(三):LoadVars对象的应用