美文网首页一起学JDK源码
一起学JDK源码 -- Double类

一起学JDK源码 -- Double类

作者: Kinsanity | 来源:发表于2018-06-06 09:57 被阅读12次

Double类是基本类型double的包装类,其中的主要属性和方法与Float类相似。在本文中就不列出了,大家可以看下一起学JDK源码 -- Float类

基础知识:

1.浮点数的表示:
浮点数由三部分组成,符号位s、指数e和尾数f。
对于float表示如下
0 00000000 00000000000000000000000
sign(1bit) exponent(8bit) fraction(23bit) 共32bit
对于求值我们是有一个公式对应的,某个浮点数的值为:
(−1)^s ∗ (1.f) ∗ 2^(e−127)
可以看到32位的最高位为符号标识符,1表示负数,0表示正数。指数部分为8位,其实可以是0到255,但是为了可正可负,这里需要减去127后才是真正的指数,而底数固定为2。剩下的23位表示尾数,但默认前面都会加上1.。所以通过上面就可以将一个浮点数表示出来了。
我们举个例子来看,二进制的“01000001001101100000000000000000”表示的浮点数是啥?
符号位为0,表示正数。
指数为“10000010”,减去127后为3。
尾数对应的值为“1.011011”。
于是最终得到浮点数为“1011.011”,转成十进制为“11.375”。
2.精度丢失:
对float或double 的使用不当,可能会出现精度丢失的问题。浮点运算很少是精确的,只要是超过精度能表示的范围就会产生误差。往往产生误差不是 因为数的大小,而是因为数的精度。因此,产生的结果接近但不等于想要的结果。尤其在使用 float 和 double 作精确运 算的时候要特别小心。如:
System.out.println(0.1d + 0.2d);这个输出的结果不是我们想要的0.3而是0.30000000000000004。这就是java中的精度丢失。可以使用如下方式解决:

        BigDecimal b1 = new BigDecimal("0.1");
        BigDecimal b2 = new BigDecimal("0.2");
        System.out.println(b1.add(b2));

所以大家在遇到金钱等对精度要求较高的业务时最好不要使用浮点类型的数。可以考虑使用BigDecimal。或是把单位转换成分,这样处理的数字都是整数,最后再化成小数。这样就不会出现精度丢失的问题了。

查看所有目录

相关文章

  • 一起学JDK源码 -- Double类

    Double类是基本类型double的包装类,其中的主要属性和方法与Float类相似。在本文中就不列出了,大家可以...

  • 基于JDK1.8,Java容器源码分析

    容器源码分析 如果没有特别说明,以下源码分析基于 JDK 1.8。 在 IDEA 中 double shift 调...

  • 一起学JDK源码 -- Integer类

    Integer类为java基本类型int的包装类,除了前面提到的Byte类,Short类中的大部分方法,Integ...

  • 一起学JDK源码 -- Short类

    short是java基本数据类型中的一种,为短整型,占2个字节,16位。Short为short类型的包装类。 基础...

  • 一起学JDK源码 -- Byte类

    byte即字节的意思,java中的基本类型之一、也是java中长度最小的基本数字类型,通常在读取文件时需要用字节数...

  • 一起学JDK源码 -- Number类

    java是强类型语言,它提供了八种基本数据类型, 其中有六种数字类型,分别是byte、short、int、lon...

  • 一起学JDK源码 -- Long类

    Long类为java基本类型long的包装类,其中提供了一些处理long类型的方法。但是大部分方法名称和实现都同I...

  • 一起学JDK源码 -- StringBuilder类

    查看所有目录StringBuilder从类名语义上来说String构建者,用来创建String的。在java开发中...

  • 一起学JDK源码 -- StringBuffer类

    查看所有目录同StringBuilder类类似,StringBuffer类也是用来构建动态String对象的,但与...

  • 一起学JDK源码 -- System类

    查看所有目录说起System类,对我们来说既熟悉又陌生,熟悉的是我们刚接触java时就会用到这个类,甚至每天写代码...

网友评论

    本文标题:一起学JDK源码 -- Double类

    本文链接:https://www.haomeiwen.com/subject/kmovsftx.html