文档没有特别好地解释,但

Double.toString(double)基本上在它产生的输出中执行一些舍入. Double.toString算法在整个Java SE中使用,包括例如System.out的PrintStream.println(double).文档说明了这一点:

How many digits must be printed for the fractional part of m or a? There must be at least one digit to represent the fractional part,and beyond that as many,but only as many,more digits as are needed to uniquely distinguish the argument value from adjacent values of type double. That is,suppose that x is the exact mathematical value represented by the decimal representation produced by this method for a finite nonzero argument d. Then d must be the double value nearest to x; or if two double values are equally close to x,then d must be one of them and the least significant bit of the significand of d must be 0.

换句话说,它表示toString的返回值不一定是参数的精确十进制表示.唯一的保证是(粗略地说)参数比任何其他双值更接近返回值.

因此,当您执行类似System.out.println(1.10)和1.10的操作时,这并不意味着传入的值实际上等于基数10值1.10.相反,基本上会发生以下情况:

>首先,在编译期间,检查文字1.10并舍入以产生最接近的double值. (它在JLS here中说,对此的规则例如在Double.valueOf(String)中详细说明为double.)

>其次,当程序运行时,Double.toString生成一个十进制值的字符串表示形式,上一步生成的double值比任何其他double值更接近.

恰好在第二步中转换为String通常会生成一个与第一步中的文字相同的String.我认为这是设计的.无论如何,文字,例如1.10不会产生一个精确等于1.10的双精度值.

您可以使用BigDecimal(double)构造函数发现double(或float的实际值,因为它们总是可以放在double中):

When a double must be used as a source for a BigDecimal,note that this constructor provides an exact conversion; it does not give the same result as converting the double to a String using the Double.toString(double) method and then using the BigDecimal(String) constructor. To get that result,use the static valueOf(double) method.

// 0.899999999999999911182158029987476766109466552734375

System.out.println(new BigDecimal((double) ( 2.00 - 1.10 )));

// 0.89999997615814208984375

System.out.println(new BigDecimal((float) ( 2.00 - 1.10 )));

你可以看到,结果都不是0.9.在这种情况下,Float.toString恰好产生0.9而Double.toString则不然,这或多或少只是巧合.

作为旁注,(双)(2.00 – 1.10)是一个冗余演员. 2.00和1.10已经是双重文字,因此评估表达式的结果已经是双倍的.另外,要减去float,你需要转换两个操作数,如(float)2.00 – (float)1.10或使用浮动文字,如2.00f – 1.10f. (float)(2.00 – 1.10)仅将结果转换为float.

为什么java中floatda正确_为什么cast to float在java中产生正确的结果?相关推荐

  1. java 同步块 抛出异常_不把 wait 放在同步块中,为啥这种情况不会抛出 IllegalMonitorStateException?...

    这是一个来自 Java 编程思想的例子,它只是想表达 sleep 的线程可中断,但同步 IO 等待资源,或同步获得锁失败的线程,是不可同步的. //: concurrency/Interrupting ...

  2. java有关的论述_中国大学MOOC: 以下有关JAVA线程的论述,正确的是()。

    中国大学MOOC: 以下有关JAVA线程的论述,正确的是(). 答:Java 线程由JAVA虚拟机JVM管理 Java 线程创建有两种方法:1)扩展java.lang.Thread类:2)实现Runn ...

  3. java grpc 服务路由_.NET Core 3.0 Preview 3中关于ASP.NET Core的更新内容

    原标题:.NET Core 3.0 Preview 3中关于ASP.NET Core的更新内容 英文:devblogs.microsoft.com 来源:艾心 译文:cnblogs.com/ediso ...

  4. java执行python脚本_使用Runtime.getRuntime().exec()在java中调用python脚本

    举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...

  5. java 变量名 字符串_如何使字符串值在java中调用特定的现有JButton变量名?

    所以,我知道有这样的: int number = Integer.parseInt("5"); String numtxt = Integer.toString(12); doub ...

  6. java 代码名称转换_计算机编码基础知识及Java中编码转换

    1.ASCII 码 学过计算机的人都知道 ASCII 码,ASCII 码是美国标准信息交换代码(American Standard Code for Information Interchange)的 ...

  7. 中科方德java开发编码规范_插件推荐:如何将Java编码规范落地实际开发中

    一个软件需要花费80%的生命周期成本去维护. 几乎没有任何软件的整个生命周期仅由其原作者来维护. 编码规范改善软件的可读性,让工程师更快更彻底地理解新的代码. 如果你将源代码转变为一个产品,那么您需要 ...

  8. Java游戏守卫者_我的世界:当java版玩家遇上基岩版玩家,原来MC中也存在语言不通...

    原标题:我的世界:当java版玩家遇上基岩版玩家,原来MC中也存在语言不通 事情起因:有小伙伴投稿,说自己被同学拉入了一个<我的世界>群聊,自己原准备大侃特侃,但发现他们聊的东西跟自己玩的 ...

  9. java 夏令时 重置偏移量_那些年我们踩过的坑——Java中Date夏令时日期转换不一致问题...

    一.问题描述 前段时间遇到一个很神奇且费解的问题,程序将用户的生日从日期类型转为string类型时,竟然莫名其妙的少了一天,具体表现为存在数据库的19900916这个日期,取出到程序后做转换为字符串的 ...

最新文章

  1. Http访问代理使用
  2. Real VNC 5.1.1新增实用的技能:VNC Address Book
  3. mybatis批量更新报错XXXXX-Inline
  4. 引入sentinel后,json转化异常
  5. VMware VCenter模板不显示问题
  6. SAP Fiori Launchpad tile点击之后的跳转链接是如何解析出来的
  7. php中tags,php中strip_tags()函数的用法举例
  8. [C++] 转义序列
  9. HDU odd-even number 数位dp
  10. 构建之法:1、2、3章阅读后感
  11. 是时候详细探究webview了
  12. UVA 12161 Ironman Race in Treeland (树分治)
  13. 如何让你的SQL运行得更快(二)
  14. RAID技术及应用总结
  15. java开发微信公众号入门指引,jsp(java)开发微信公众平台入门
  16. MySQL顺序读写和随机读写磁盘_随机读写与顺序读写的深入理解
  17. 通过透明网关访问MSQL
  18. 电脑重置后需要清除tpm吗
  19. 终端常用的命令及功能
  20. android 程序白屏,Android冷启动白屏问题

热门文章

  1. .net函数查询_SQL查询语句总是先执行SELECT?你们都错了!
  2. C++局部变量和全局变量的初始化
  3. MATLAB自定义画布大小
  4. tf.gfile()函数
  5. torch版ResNet50(带有多输出)转c++ tensorrt
  6. Linux中的chmod详解
  7. 用法 stl_C++STL 容器篇
  8. java logout session_会话跟踪技术--session的使用
  9. CSDN 统一标签设计 征求反馈
  10. 顶级程序员的心得 Coders at Work (I)