比较基本类型double和float和某一个数是否相等的时候,不要用==或>=或<=,因为double和float都是有精度问题的,计算机只能保存一定位数的小数,这就会存在精度问题。

下面我们看一下java中float和double能够比较到小数后几位:

代码实现:

  1. public class Main {
  2. public static void main(String[] args) {
  3. float f6 = 1.000003f;//6位小数位,总共7位
  4. float f_8 = 10.000003f;//6位小数位,总共8位
  5. double d15 = 1.000000000000003;//15位小数位,总共16位
  6. double d_17 = 10.000000000000003;//15位小数位,总共17位
  7.  
  8. float f7 = 1.0000003f;//7位小数位,总共8位
  9. float f_9 = 10.0000003f;//7位小数位,总共9位
  10. double d16 = 1.0000000000000003;//16位小数位,总共17位
  11. double d_18 = 10.0000000000000003;//16位小数位,总共18位
  12.  
  13. float f8 = 1.00000003f;//8位小数位,总共9位
  14. float f_10 = 10.00000003f;//8位小数位,总共10位
  15. double d17 = 1.00000000000000003;//17位小数位,总共18位
  16. double d_19 = 10.00000000000000003;//17位小数位,总共19位
  17.  
  18. System.out.println(f6==1);
  19. System.out.println(d15==1);
  20. System.out.println("------------------");
  21.  
  22. System.out.println(f7==1);
  23. System.out.println(d16==1);
  24. System.out.println("------------------");
  25.  
  26. System.out.println(f8==1);
  27. System.out.println(d17==1);
  28. System.out.println("------------------");
  29. //-----------------------------------------------
  30. System.out.println(f_8==10);
  31. System.out.println(d_17==10);
  32. System.out.println("------------------");
  33.  
  34. System.out.println(f_9==10);
  35. System.out.println(d_18==10);
  36. System.out.println("------------------");
  37.  
  38. System.out.println(f_10==10);
  39. System.out.println(d_19==10);
  40. System.out.println("------------------");
  41. }
  42. }

输出结果:

false
false
------------------
false
false
------------------
true
true
------------------

------------------------------------------

false
false
------------------
true
true
------------------
true
true
------------------

再举一个案例:

  1. public class Main {
  2. public static void main(String[] args) {
  3. float f6 = 10000003.87f;//整数位8位,总共10位
  4. float f_8 = 100000003.87f;//整数位9位,总共11位
  5.  
  6. System.out.println(f6==10000003);
  7.  
  8. System.out.println(f_8==100000003);
  9. }
  10. }

输出结果:

false

true

上面两个案例说明,float和double的精确度是按照整体位数来的,并不是只是考虑小数部分。根据显示结果可以看出,float只能精确8位,double可以精确比较到17位,超出比较的精度就会得到错误的结果。

Java中float和double的精度的更多相关文章

  1. 精确计算java中float和double的精度

    [本文相关的代码放在github上.地址为:https://github.com/VigourJiang/StructuredFloat] Java中double类型的格式基本遵循IEEE 754标准 ...

  2. Java中 float、double使用注意问题

    在java中运行一下代码 System.out.println(2.00-1.10);输出的结果是:0.8999999999999999很奇怪,并不是我们想要的值0.9 再运行如下代码:System. ...

  3. Java中float和double转换的问题

    为什么double转float不会出现数据误差,而float转double却误差如此之大?   double d = 3.14; float f = (float)d; System.out.prin ...

  4. Java中float、double、long类型变量赋值添加f、d、L尾缀问题

    展开1. 添加尾缀说明 我们知道Java在变量赋值的时候,其中float.double.long数据类型变量,需要在赋值直接量后面分别添加f或F.d或D.l或L尾缀来说明.  其中,long类型最好以 ...

  5. JAVA中float与double的区别

    float是单精度类型,精度是8位有效数字,取值范围是10的-38次方到10的38次方,float占用4个字节的存储空间 double是双精度类型,精度是17位有效数字,取值范围是10的-308次方到 ...

  6. java中float和double的区别

    float表示单精度浮点数在机内占4个字节,用32位二进制描述. double表示双精度浮点数在机内占8个字节,用64位二进制描述.浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分. ...

  7. 【转】JAVA程序中Float和Double精度丢失问题

    原文网址:http://blog.sina.com.cn/s/blog_827d041701017ctm.html 问题提出:12.0f-11.9f=0.10000038,"减不尽" ...

  8. float和double的精度

    作者: jillzhang 联系方式:jillzhang@126.com 原网址:http://blog.csdn.net/wuna66320/article/details/1691734 1 范围 ...

  9. float与double的精度和范围

    1 范围 float和double的范围是由指数的位数来决定的. float的指数位有8位,而double的指数位有11位,分布如下: float: 1bit(符号位) 8bits(指数位) 23bi ...

  10. Java中long和double的原子性

    Java中long和double的原子性 java中基本类型中,long和double的长度都是8个字节,32位(4字节)处理器对其读写操作无法一次完成,那么,JVM,long和double是原子性的 ...

随机推荐

  1. java bean 慎用 is开头isXxx开头的属性,若必须得用,那么一定要记得 idea自动生成的 setter 和 getter会不标准,从而会引起问题,他自动生成后,需要手工再次进行修改,才可使用,要不然有可能引起各种问题

    直接上例子: 然后用 Idea 自动生成 getter 和 setter public class XyzBean { //最普通的 private String name; //Boolean类型, ...

  2. 下载安装JDK 和 IntelliJ IDEA 和 ActiveMq

    wget http://yun.diandaxia.com/other/jdk-8u92-linux-x64.rpm rpm -ivh jdk-8u92-linux-x64.rpm wget http ...

  3. Windows OhmGraphite 配置

    Windows OhmGraphite 配置 由于windows_exporter无法监控温度相关的指标,那么就需要使用OhmGraphite进行监控该指标. 下载 访问 https://github ...

  4. NC16611 [NOIP2009]最优贸易

    题目链接 题目 题目描述 C国有n个大城市和m条道路,每条道路连接这n个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向 ...

  5. ARP(Address Resolution Protocol) Packet

    Address Resolution Protocol The Address Resolution Protocol (ARP) is a communication protocol used f ...

  6. Js中Reflect对象

    Js中Reflect对象 Reflect是ES6起JavaScript内置的对象,提供拦截JavaScript操作的方法,这些方法与Proxy对象的handlers中的方法基本相同. 描述 Refle ...

  7. nginx添加站点

    1.修改配置文件 vim /usr/local/nginx/conf/nginx.conf 添加一个server节点: server {         listen          81;     ...

  8. SpringBoot整合Groovy脚本,实现动态编程

    Groovy简介 Groovy 是增强 Java 平台的唯一的脚本语言.它提供了类似于 Java 的语法,内置映射(Map).列表(List).方法.类.闭包(closure)以及生成器.脚本语言不会 ...

  9. win32 - 使用Safer API创建受限的令牌

    #include <Windows.h> #include <WinSafer.h> #include <stdio.h> #include <sddl.h& ...

  10. Mysql 插入timestamp没有使用默认值问题

    在一次升级过程中,发现Mysql插入数据报了个错 Column 'create_time' cannot be null. 但是看了下这个字段虽然是非null,但是是有默认值的 `create_tim ...