java总结

本文详细介绍了Java中浮点数类型float和double的精度表现,包括它们的存储格式、有效位数以及浮点数无法精确表示的原因。同时,提到了strictfp关键字在确保浮点数运算准确性方面的作用,但即使如此,仍存在精度限制。最后,简要概述了Java进行数学计算的一些常见方法,如平方根、指数和四舍五入,并推荐使用BigDecimal进行精确计算。
摘要由CSDN通过智能技术生成

                                                                    浮点数类型

     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的随机数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值