包装类之Float源码分析
来源:互联网 发布:特百惠淘宝上有真的吗 编辑:程序博客网 时间:2024/06/06 00:17
包装类Float源码分析:(Double同理)
java float类型用IEEE754标准规定
float类型占4个字节(32位),其中包括1位的符号位,8位的指数位,和23位的小数位
(对于double双精度浮点数,用 1 位表示符号,用 11 位表示指数,52 位表示尾数,其中指数域称为阶码。)
类声明:(与其他包装类类似)
public final class Float extends Number implements Comparable<Float>
成员:
1.POSITIVE_INFINITY/NEGATIVE_INFINITY :正无穷大(Infinity)/负无穷大(-Infinity)
public static final float POSITIVE_INFINITY = 1.0f / 0.0f; public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;
说明:这是java的规定,没必要深究为什么1.0/0.0不报错,不过1/0肯定报错
2.NaN:Not a Number(不是数)(输出就是NaN)
public static final float NaN = 0.0f / 0.0f;
3.MAX_VALUE/MIN_VALUE :最大最小值,以16进制形式+科学计数法表示,后面有10进制+科学计数法的注释
public static final float MAX_VALUE = 0x1.fffffeP+127f; // 3.4028235e+38fpublic static final float MIN_VALUE = 0x0.000002P-126f; // 1.4e-45f
4.MAX_EXPONENT/MIN_EXPONENT :指数部分的最大值(指数位的长度1个字节):127,最小值为-126
public static final int MAX_EXPONENT = 127;public static final int MIN_EXPONENT = -126;
5.SIZE :一个float占4个字节(32位)
public static final int SIZE = 32;
6.TYPE :FLoat对应的基本类型为float
public static final Class<Float> TYPE = Class.getPrimitiveClass("float");
7.value:每个Float对应的float
private final float value;
类方法:
1.toString(float f):
public static String toString(float f) { return new FloatingDecimal(f).toJavaFormatString(); }
FloatingDecimal:的作用是将float格式化转换,即什么时候用数字显示(位数小于8位),什么时候用指数显示(位数>=8位)
更加详细的在API中有说明
2.toHexString(float f):转成16进制的字符串(用科学计数法表示)
public static String toHexString(float f) { if (Math.abs(f) < FloatConsts.MIN_NORMAL && f != 0.0f ) {// float subnormal // Adjust exponent to create subnormal double, then // replace subnormal double exponent with subnormal float // exponent String s = Double.toHexString(FpUtils.scalb((double)f, /* -1022+126 */ DoubleConsts.MIN_EXPONENT- FloatConsts.MIN_EXPONENT)); return s.replaceFirst("p-1022$", "p-126"); } else // double string will be the same as float string return Double.toHexString(f); }
3.两个valueOf():将字符串/浮点数转换成Float类型的对象
public static Float valueOf(String s) throws NumberFormatException { return new Float(FloatingDecimal.readJavaFormatString(s).floatValue()); } public static Float valueOf(float f) { return new Float(f); }
4.parseFloat(String s):和valueOf重复了
public static float parseFloat(String s) throws NumberFormatException { return FloatingDecimal.readJavaFormatString(s).floatValue(); }
5.isNaN(float v):判断是不是一个‘不是数’(NaN和任何东西都不想等,包括他自己)
static public boolean isNaN(float v) { return (v != v); }
6.isInfinite(float v):判断是不是正无穷或者负无穷(这两个数使计算没有任何意义)
static public boolean isInfinite(float v) { return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY); }
7.floatToRawIntBits(float value) floatToIntBits(float value) intBitsToFloat(int bits):
- 根据 IEEE 754 的浮点“单一形式”中的位布局,返回指定浮点值的表示形式
- 根据 IEEE 754 的浮点“单一形式”中的位布局,返回指定浮点值的表示形式,并保留非数字 (NaN) 值。
- 返回对应于给定的位表示形式的 float 值。该参数被认为是符合 IEEE 754 的浮点“单一形式”中的位布局规定的浮点值表示形式
public static native float intBitsToFloat(int bits); public static native int floatToRawIntBits(float value); public static int floatToIntBits(float value) { int result = floatToRawIntBits(value); // Check for NaN based on values of bit fields, maximum // exponent and nonzero significand. if ( ((result & FloatConsts.EXP_BIT_MASK) == FloatConsts.EXP_BIT_MASK) && (result & FloatConsts.SIGNIF_BIT_MASK) != 0) result = 0x7fc00000; return result; }
8.compare(float f1, float f2):比较两个float的大小
public static int compare(float f1, float f2) { if (f1 < f2) return -1; // Neither val is NaN, thisVal is smaller if (f1 > f2) return 1; // Neither val is NaN, thisVal is larger int thisBits = Float.floatToIntBits(f1); int anotherBits = Float.floatToIntBits(f2); return (thisBits == anotherBits ? 0 : // Values are equal (thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN) 1)); // (0.0, -0.0) or (NaN, !NaN) }
这两个数相加位NaN,相乘为负无穷
构造器:
1.Float(float value):
public Float(float value) { this.value = value; }
2.Float(double value):用double强转
public Float(double value) { this.value = (float)value; }
- Float(String s):用字符串初始化
public Float(String s) throws NumberFormatException { // REMIND: this is inefficient this(valueOf(s).floatValue()); }
方法(对成员value的操作)
- isNaN():是不是一个’数’
public boolean isNaN() { return isNaN(value); }
2.isInfinite():是不是正无穷或者负无穷
public boolean isInfinite() { return isInfinite(value); }
- toString():转成字符串
public String toString() { return String.valueOf(value); }
4.各种value方法:
public byte byteValue() { return (byte)value; } public short shortValue() { return (short)value; } public int intValue() { return (int)value; } public long longValue() { return (long)value; } public float floatValue() { return value; } public double doubleValue() { return (double)value; }
5.hashCode():返回HashCode值(这个和整数的包装类就不一样的。整数的HashCode都是它本身的值)
public int hashCode() { return floatToIntBits(value); }
6.equals(Object obj):判断value的值属否相等
public boolean equals(Object obj) { return (obj instanceof Float) && (floatToIntBits(((Float)obj).value) == floatToIntBits(value)); }
- compareTo(Float anotherFloat):比较value的值的大小(实质是调用compare(float f1, float f2)这个静态方法)
public int compareTo(Float anotherFloat) { return Float.compare(value, anotherFloat.value); }
- 包装类之Float源码分析
- java学习之旅63常用类_包装类_Integer_Number_JDK源码分析
- JAVA源码分析---基本类型对应的包装类之基本框架
- 包装类之Character源码简析
- 63_常用类_包装类_Integer_Number_JDK源码分析
- 【JAVA源码分析——Java.lang】包装类源码分析
- 【源码】java包装类总结
- javaAPI之包装类
- 常用类第十二八课,包装类Integer,Number,JDK源码分析
- 【源码分析】Elastic-Job源码分析之JobScheduler类分析
- SQLite3简单C++包装类源码示例
- java知识之包装类
- java基础之包装类
- java学习之包装类
- java基础之包装类
- 包装类之装箱、拆箱
- java基础之包装类
- 需求分析方法及包装类
- 14、spring和spring mvc整合
- Gym
- SQLite数据类型的注意事项
- 动物声音"模拟器"
- Ctags详细用法
- 包装类之Float源码分析
- Intellij IDEA配置tomcat(非maven项目)
- 通信原理之模拟信号发射和接收
- Beautifulsoup去除特定标签
- org.springframework.cache.jcache未找到
- echarts 属性设置简介
- elasticsearch-mapping字段类型
- 17年端午~
- Linux磁盘分区