此处大致说一下浮点型的注意事项以及两道例题, 例题的问题就在源码注释中, 不再另外打出,
tip:
说明: 浮点数运算有误差, 所以不可直接运算
* 有一下两种解决方法:
* 1. 一般认为, 只要浮点数的误差不超过 10 的 - 10 次方, 就可以认为二者相等, 所以此处可以利用 Math 包里的 abs 方法来算出二者的绝对值, 然后和 1E-10(java 中表示十的负十次方), 如果绝对值小宇 1E-10, 就认为二者相等
* 2. 将题目中的等式变为只有整数的式子, 这样就不存在误差了, 一般是通分
浮点数有五个特殊数值
正负无穷大: Infinity,-Infinity 比如 1.0/0.0 1.0/-0.0
正负无穷小: 0.0,-0.0 比如 1/Infinity,1/-infinity
没有意义: NaN 比如 0.0/0.0
关于高精度的浮点型可以使用 BigDecimal 类中的方法来定义以及运算,
* 同时, 利用 MathContext 类的方法可以定义小数的精度范围, 比如定义 100, 就是小数点后面 100 位
* MathContext 类还可以设置精度最后一位的取值方式, 四舍五入, 四舍六入五成双
例题一:
- /**
- * 浮点数
- * @author Administrator
- * 问题描述: 一罐可乐 2.3 元, 一罐啤酒 1.9 小明买这两种饮料一共花了 82.3 元, 问小明买了多少罐可乐, 多少罐啤酒
- * 且可乐的数量少于啤酒的数量
- */
- public class Demo09 {
- /**
- * 说明: 浮点数运算有误差, 所以不可直接运算
- * 有一下两种解决方法:
- * 1. 一般认为, 只要浮点数的误差不超过 10 的 - 10 次方, 就可以认为二者相等, 所以此处可以利用 Math 包里的 abs 方法来算出二者的绝对值, 然后和 1E-10(java 中表示十的负十次方), 如果绝对值小宇 1E-10, 就认为二者相等
- * 2. 将题目中的等式两边同时乘以 10 的倍数, 直到式子中没有小数点, 这样就不存在误差了
- * @param args
- */
- public static void main(String[] args) {
- /*case 1*/
- /* 这里直接使用暴力破解了 */
- for(int a = 0;a<35;a++) {
- for(int b = 0;b<43;b++) {
- if(a<b&&Math.abs(a*2.3+b*1.9-82.3)<1E-10) {
- System.out.println(a+","+b);
- return;
- }
- }
- }
- /*case 2*/
- for(int a = 0;a<35;a++) {
- for(int b = 0;b<43;b++) {
- if(a<b&&a*23+b*19==823) {
- System.out.println(a+","+b);
- return;
- }
- }
- }
- }
- }
例题二:
- /**
- * 一群海盗 (少于等于 20 人) 比赛酒量, 规则如下, 每次在场的人平分一瓶酒,, 然后第一次平分的时候有几个人倒下了, 第二次平分的时候又有几个人倒下去了, 第三次又有几个人倒下去了, 第四次所有人都倒下去了
- * 事后海盗船长说: 我正好喝了一瓶儿酒, 我是第四次倒下去的
- * 问每一次还没倒下的人数
- * @author Administrator
- *
- */
- public class Demo10 {
- /**
- * 关于高精度的浮点型可以使用 BigDecimal 类中的方法来定义以及运算,
- * 同时, 利用 MathContext 类的方法可以定义小数的精度范围, 比如定义 100, 就是小数点后面 100 位
- * MathContext 类还可以设置精度最后一位的取值方式, 四舍五入, 四舍六入五成双
- * @param args
- */
- public static void main(String[] args) {
- for(int a = 20;a>0;a--)
- for(int b = a-1;b>0;b--)
- for(int c = b-1;c>0;c--)
- for(int d = c-1;d>0;d--) {
- // if(Math.abs(1.0/a+1.0/b+1.0/c+1.0/d-1.0)<1E-10)System.out.println(a+","+b+","+c+","+d);
- // 利用误差很小来大致相等的方法来判断
- if(a*b*c+a*c*d+b*c*d+a*b*d==a*b*c*d)System.out.println(a+","+b+","+c+","+d);
- // 利用把式子中的数字都变成整数来判断, 避免了浮点型精度不够的问题
- }
- }
- }
解题思路: 都是直接暴力破解的, 就不讲思路了, 主要是浮点型精度的问题
希望对大家有所帮助
以上
来源: http://www.bubuko.com/infodetail-2990928.html