浮点数类型
float单精度、double双精度 float是4B,可以保证小数点后6位有效精度和第7位的部分精度 e38 double是8B,可以保证小数点后15位有效精度和第16位的部分精度。e308 浮点数是无法精确存放的,原因在于将浮点数转换为补码时的限制
System.out.println(Integer.MAX_VALUE); System.out.println(Integer.MIN_VALUE); int k1=123; int k2=0123; int k3=0x123; int k4=0b100101; System.out.println(k1+"\t"+k2+"\t"+k3+"\t"+k4);//具体输出时,系统会自动将k2转换为10进 制输出 int k = 123; String ob=Integer.toBinaryString(k);//将十进制数转换为2进制的字符串 System.out.println(ob); //1111011 String oo=Integer.toOctalString(k); System.out.println(oo); //173 String oh=Integer.toHexString(k); System.out.println(oh);//7b 123系统会自动识别为int类型 123L或者123l系统自动识别为long 针对浮点数则不能使用等值判断 Java浮点数都是用科学计数法来存储数据的,无论是单精度还是双精度在存储中都分为三个部分: 符号位Sign : 0代表正,1代表为负,是第一位 指数位Exponent:用于存储科学计数法中的指数数据,单精度为8位,双精度11位。用指数部分的 值(8位/11位unsigned)的值减去偏移附加值得到该数实际的指数。例如值为200,实际指数为 73=200-127,对于双精度的double来说常量1023 尾数部分Mantissa 样例17.625在内存中的存储为: 首先要把17.625换算成二进制:10001.101 整数部分:除以2,直到商为0,余数反转 小数部分:乘以2,直到乘位为0,进位顺序取。(即:乘2取整法) 再将10001.101右移,直到小数点前只剩1位,1.0001101*2^4 ,右移动了四位。 底数:因为小数点前必为1,所以IEEE规定只记录小数点后的就好。所以,此处的底数为 0001101 指数:实际为4,必须加上127(转出的时候,减去127/1023),所以为131。也就是 10000011 符号:因为是正数,所以是0 综上所述,17.625在内存中的存储格式是:01000001 10001101 00000000 00000000 在Java中浮点数无法精确存放,除非使用BigDecimal float:4B:1.4E-45到3.4028235E38 保存7-8位有效数据 double:8B:4.9E-324到1.7976931348623157E308 保存15-16位有效数据 注意:浮点数无法精确存放 表示方法: 十进制数形式。由数字和小数点组成,且必须有小数点,如0.123, 1.23, 123.0 科学计数法形式。如:123e3或123E-3,其中e或E之前必须有数字,且e或E后面的指数必须为整数 f或者F表示float,而d或者D代表double。
例如123f或者123.45D,系统默认为double类型。
Java精确计算问题
关键字strictfp是strict float point的缩写,指的是精确浮点,它是用来确保浮点数运算的准确性。 JVM在执行浮点数运算时,如果没有指定strictfp关键字,此时计算结果可能会不精确,而且计算 结果在不同平台或厂商的虚拟机上会有不同的结果,导致意想不到的错误。而一旦使用了strictfp 来声明一个类、接口或者方法,那么在所声明的范围内,Java编译器以及运行环境会完全依照IEEE 二进制浮点数算术标准来执行,在这个关键字声明的范围内所有浮点数的计算都是精确的。 需要注意的是,当一个类被strictfp修饰时,所有方法都会自动被strictfp修饰。因此,strictfp可以保证 浮点数运算的精确性,而且在不同的硬件平台会有一致的运行结果。但是精确计算事实上还是没有得到 保障,这是受到存储方式的限制。需要精确计算还是以来BigDecimal实现的。
常见的数学计算
Java的Math类中包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。 Math的方法都被定义为static 形式,通过Math类可以在主函数中直接调用。 Math.sqrt()计算平方根 Math.pow(a, b)计算a的b次方 Math.max(a,b)计算最大值 Math.min(a,b)计算最小值 Math.abs()求绝对值 Math.ceil天花板的意思,就是返回大的值;floor地板的意思,就是返回小的值;round 四舍五 入,float时返回int值,double时返回long值 random 取得一个大于或者等于0.0小于不等于1.0的随机数。