zoukankan      html  css  js  c++  java
  • [七]基础数据类型之Float详解

     
     
    Float 基本数据类型float  的包装类
    Float 类型的对象包含一个 float 类型的字段
    image_5bbad0f1_7640  

    属性简介

    用来以二进制补码形式表示 float 值的比特位数 public static final int SIZE = 32;
    二进制补码形式表示 float 值的字节数 public static final int BYTES = SIZE / Byte.SIZE;
    表示基本类型 float 的 Class 实例 public static final Class<Float> TYPE = (Class<Float>) Class.getPrimitiveClass("float");
    能够表示的最大值
    只有标准化一种形式,也就是前文提到过的
    image_5bbad0f1_75e8
    public static final float MAX_VALUE = 0x1.fffffeP+127f;
    标准化的最小值
    image_5bbad0f1_214a
    public static final float MIN_NORMAL = 0x1.0p-126f;
    最小值还有非标准化的形式
    image_5bbad0f1_1285
    public static final float MIN_VALUE = 0x0.000002P-126f;
    正无穷
    它等于 Float.intBitsToFloat(0x7f800000) 返回的值
    public static final float POSITIVE_INFINITY = 1.0f / 0.0f;
    负无穷
    它等于 Float.intBitsToFloat(0xff800000) 返回的值
    public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;
    NaN
    not a number
    它等于 Float.intBitsToFloat(0x7fc00000) 返回的值
    public static final float NaN = 0.0f / 0.0f;
    指数真值的有效的最大值 public static final int MAX_EXPONENT = 127;
    指数真值的有效的最小值 public static final int MIN_EXPONENT = -126;
     
    这些属性,看过上一篇浮点数简介的话,可以很清晰的理解     

    构造方法

    Float 依然提供了根据基本类型float以及float的String形式构造
    String形式依然借助于parseXXX形式 parseFloat
    另外,也提供了根据基本类型double进行构造的方式,内部直接强转
    Float(float value) image_5bbad0f1_4d5f
    Float(String s) image_5bbad0f1_7726
    Float(double value) 直接强转
    image_5bbad0f1_18ff
     

    常用方法

    对于浮点数,有一些额外的属性方法
    我们浮点数介绍中,对于浮点数的表示形式进行了介绍
    image_5bbad0f1_4c4c
    Float提供了对于指定值的表示形式的获取方法, 这表示形式也就是是一个32位的二进制位序列
     
    Float 获取表示形式
    对于获取表示形式 提供了两种形式的方法,主要是针对于非数字的NaN的不同表示
    他们可以与intBitsToFloat 可以进行互相转换

    floatToRawIntBits
    如果参数为正无穷大,则结果为 0x7f800000
    如果参数为负无穷大,则结果为 0xff800000
    如果参数为 NaN,则结果是表示实际 NaN 值的整数
    与 floatToIntBits 方法不同,floatToRawIntBits 不压缩所有将 NaN 编码为一个“规范”NaN 值的位模式。
     
    在所有情况下,结果都是一个整数,将其赋予 intBitsToFloat(int) 方法将生成一个与 floatToRawIntBits 的参数相同的浮点值
     
    本地方法
    image_5bbad0f1_2259
    floatToIntBits
    如果参数为正无穷大,则结果为 0x7f800000
    如果参数为负无穷大,则结果为 0xff800000
    如果参数为 NaN,则结果为 0x7fc00000
     
    在所有情况下,结果都是一个整数
    将其赋予 intBitsToFloat(int) 方法将生成一个浮点值,该浮点值与 floatToIntBits 的参数相同
    (而所有 NaN 值则会生成一个“规范”NaN 值)
     
    依赖floatToRawIntBits
    image_5bbad0f1_72b3
    将表示形式转换为Float,返回对应于给定位表示形式的 float 值
    本地方法
    其实就是按照布局计算float
    image_5bbad0f1_7297

    如果参数为 0x7f800000,则结果为正无穷大
    如果参数为 0xff800000,则结果为负无穷大
    如果参数值在 0x7f800001 到 0x7fffffff 或在 0xff800001 到 0xffffffff 之间,则结果为 NaN
     
    Java 提供的任何 IEEE 754 浮点操作都不能区分具有不同位模式的两个同类型 NaN 值
    不同的 NaN 值只能使用 Float.floatToRawIntBits 方法区分
     
    浮点数有几种特殊的表示,比如 无穷 NaN等
    额外的,也提供了一些相关的方法
     
    static boolean isNaN(float v) 静态方法
    是否一个非数字 (NaN) 值
    非数值 true
    image_5bbad0f1_26c4
    static boolean isFinite(float f) 静态方法
    是否是有限的浮点数
    有限的true
    image_5bbad0f1_1a9e
    static boolean isInfinite(float v) 静态方法
    是否是无穷大
    是无穷大  true
    image_5bbad0f1_4a1d
    boolean isInfinite() 实例方法
    依赖静态方法
    image_5bbad0f1_25ec
    boolean isNaN()
    实例方法
    依赖静态方法
    image_5bbad0f1_714c
     

    比较

    static int compare(float f1, float f2) 静态方法
    比较两个float
    f1 < f2 小于0
    f1 = f2 等于0
    f1 > f2 大于0
    int compareTo(Float anotherFloat) 实例方法
    两个对象进行大小比较,依赖于静态方法
    image_5bbad0f2_59b5
     

    parseXXX系列

    字符串解析 为 基本类型,
    不需要对象,所以都是静态方法
    image_5bbad0f2_10b1
    返回一个字符串形式表示的基本类型float
    表现效果同valueOf(String),不过valueOf 返回的是对象
    如果String是null或者不包含可以解析的字符串将会抛出异常
    底层依赖sun.misc.FloatingDecimal
    image_5bbad0f2_5467

     
     

    valueOf系列

    把基本基本类型 包装为对象
    用来创建获得对象,所以无需对象,全都是静态方法
    image_5bbad0f2_6662
     
    不同于之前介绍的整数 数值,他们都有缓冲
    float不存在缓存,valueOf也是直接new 对象
    static Float valueOf(float f) image_5bbad0f2_234c
    static Float valueOf(String s) 依赖parseFloat方法
    所以上面说跟valueOf(String)表现效果相同,本身就是一样
    image_5bbad0f2_356f
     
     

    Float没有 decode方法

    XXXValue系列

    类似之前介绍的其他数值类型
    全部都是强转内部的  value
    return (XXX)value;
    byteValue()
    shortValue()
    intValue()
    longValue()
    floatValue()
    doubleValue()

    toString  toXXXString  系列

    static String toString(float f) 静态方法
    image_5bbad0f2_c
    String toString() 实例方法
    内部调用  static String toString(float f)
    image_5bbad0f2_4a12
    static String toHexString(float f) 静态方法
    返回 float 参数的十六进制字符串表示形式
    image_5bbad0f2_279b
    toString系列好像没什么好说的,又好像有很多要说的
    用到的时候对于格式字符的规定有疑惑直接查看API    

    equals

    boolean equals(Object obj) 
    将此对象与指定对象进行比较
    当且仅当参数不是 null 而是 Float 对象,且表示的 float 值与此对象表示的 float 值相同时,结果为 true
    为此,当且仅当将方法 #floatToLongBits(double) 应用于两个值所返回的 int 值相同时,才认为这两个 float 值相同
     
    注意,在大多数情况下,对于 Float 类的两个实例 f1 和 f2,当且仅当
    f1.floatValue() == f2.floatValue()
    的值为 true 时,f1.equals(f2) 的值才为 true。但是,有以下两种例外情况:
    如果 f1 和 f2 都表示 Float.NaN,那么即使 Float.NaN==Float.NaN 的值为 false,equals 方法也将返回 true
    所以此处使用的是floatToIntBits,而不是raw的
     
    如果 f1 表示 +0.0f,而 f2 表示 -0.0f,或相反,那么即使 0.0f==-0.0f 的值为 true,equal 测试也将返回 false
    该定义使得哈希表得以正确操作。
    image_5bbad0f2_70a3

    hashCode

    static int hashCode(float value) 静态方法
    获得一个value的hashcode值
    image_5bbad0f2_7357
    int hashCode() 实例方法
    依赖静态方法
    image_5bbad0f2_9c2

    其他方法

    sum(float, float) image_5bbad0f2_319
    max(float, float) image_5bbad0f2_58be
    min(float, float) image_5bbad0f2_6c7f
     

    总结

    其实浮点数的表示形式与使用规范才是重点
    Float只是float的包装,float也只是IEEE754 标准的一个实现,根本还是在于标准的理解
     
     
     
  • 相关阅读:
    15.RDD 创建内幕解析
    14.spark RDD解密
    我的读书笔记-《异类》
    深入解析单例线程安全问题的迷思
    一个关于数学归纳法的悖论问题-续
    一个关于数学归纳法的悖论问题
    简易解说拉格朗日对偶(Lagrange duality)(转载)
    unity3d NavMeshAgent 寻路画线/画路径
    unity3d easytouch计算摇杆旋转角度以及摇杆八方向控制角色
    unity3d 摄像机跟随角色时被物体遮挡解决方案
  • 原文地址:https://www.cnblogs.com/noteless/p/9753451.html
Copyright © 2011-2022 走看看