注意Java除法运算的陷阱

举报
ShaderJoy 发表于 2021/12/30 01:07:29 2021/12/30
【摘要】 除法运算谁不会啊,很多人不屑一顾,真是无知者无畏! 其实除法、求余运算有一些陷阱。一旦计算发生了问题,还很不好找。不好找的原因主要是问题的偶然性太强,如果你知道可能发生什么问题,你的代码就可以写得更安全。 数学除法规定,0不能做除数,因为会得到一个无穷大数据。 下面看看Java中如何处理这些特殊情况: 1、整数的除法: ...



下面看看Java中如何处理这些特殊情况:

1、整数的除法:
  0做除数抛运行时异常;两整数商会做取整运算,Float或Double与一个整数做除法运算,则商位Float或者Double类型,例如:


  
  1. System.out.println("------------Int相关除法----------");
  2.   System.out.println("12/10="+12/10);
  3.   System.out.println("12f/10="+12f/10);
  4.   System.out.println("12d/10="+12d/10);
  5.   System.out.println("12/10f="+12/10d);
  6.   System.out.println("12/10d="+12/10f);
  7.   ------------Int相关除法----------
  8.   12/10=1
  9.   12f/10=1.2
  10.   12d/10=1.2
  11.   12/10f=1.2
  12.   12/10d=1.2



  
  1. package lavasoft.zerotest;
  2.   /**
  3.   * 浮点型数据的除法运算测试
  4.   *
  5.   * @author leizhimin 2009-12-21 9:00:37
  6.   */
  7.   public class TestZero {
  8.   public static void main(String[] args) {
  9.   System.out.println("------------Double型----------");
  10.   Double x1 = div(2.3, 0.0);
  11.   Double x2 = div(2.3, -0.0);
  12.   Double x3 = div(0.0, 0.0);
  13.   Double x4 = div(0.0, -0.0);
  14.   Double x5 = div(0.0, 0.1);
  15.   Double x6 = div(0.0, -0.1);
  16.   if (x1.isInfinite()) System.out.println("x1无穷大!");
  17.   if (x2.isInfinite()) System.out.println("x2无穷大!");
  18.   if (x3.isNaN()) System.out.println("x3非数字!");
  19.   if (x4.isNaN()) System.out.println("x4非数字!");
  20.   if (x1 == Double.POSITIVE_INFINITY) System.out.println("x1 = Double.POSITIVE_INFINITY");
  21.   if (x2 == Double.NEGATIVE_INFINITY) System.out.println("x1 = Double.NEGATIVE_INFINITY");
  22.   if (x3 == Double.NaN) System.out.println("x3 = Double.NaN");
  23.   if (x4 == Double.NaN) System.out.println("x4 = -Double.NaN");
  24. System.out.println("---Float型---");
  25.   Float y1 = div(2.3f, 0.0f);
  26.   Float y2 = div(2.3f, -0.0f);
  27.   Float y3 = div(0.0f, 0.0f);
  28.   Float y4 = div(0.0f, -0.0f);
  29.   Float y5 = div(0.0f, -0.1f);
  30.   System.out.println("---比较测试---");
  31.   Float a = 99999999999999999999999999999999999999f;
  32.   Float b = 0.000000000000000000000000000000000000000000001f;
  33.   Float t = a / b;
  34.   System.out.println(t);
  35.   System.out.println(Float.MAX_VALUE);
  36.   if (t >= Float.MAX_VALUE) {
  37.   System.out.println("a/b的商已经超过了Float的最大值了!");
  38.   }
  39.   }
  40.   public static Double div(double a, double b) {
  41.   double x = a / b;
  42.   System.out.println(a + "/" + b + " = " + x);
  43.   return x;
  44.   }
  45.   public static Float div(float a, float b) {
  46.   float x = a / b;
  47.   System.out.println(a + "/" + b + " = " + x);
  48.   return x;
  49.   }
  50.   }
  51.  运算输出:
  52.   ----------Double型----------
  53.   2.3/0.0 = Infinity
  54.   2.3/-0.0 = -Infinity
  55.   0.0/0.0 = NaN
  56.   0.0/-0.0 = NaN
  57.   0.0/0.1 = 0.0
  58.   0.0/-0.1 = -0.0
  59.   x1无穷大!
  60.   x2无穷大!
  61.   x3非数字!
  62.   x4非数字!
  63.   x1 = Double.POSITIVE_INFINITY
  64.   x1 = Double.NEGATIVE_INFINITY
  65.   ------------Float型----------
  66.   2.3/0.0 = Infinity
  67.   2.3/-0.0 = -Infinity
  68.   0.0/0.0 = NaN
  69.   0.0/-0.0 = NaN
  70.   0.0/-0.1 = -0.0
  71.   ------------比较测试----------
  72.   Infinity
  73.   3.4028235E38
  74.   a/b的商已经超过了Float的最大值了!
  75.   Process finished with exit code 0
陷阱:



3、求余:和除法差不多。
        


  
  1. System.out.println(23%4);
  2.   System.out.println(23%-4);
  3.   System.out.println(-23%4);
  4.   System.out.println(23f%4);
  5.   System.out.println(23d%4);
  6.   System.out.println(23%4f);
  7.   System.out.println(23%4d);
  8.   System.out.println(23f%0);
  9.   System.out.println(23%0.0);
  10.   System.out.println(0.0%0.0);
  11.   运行结果:
  12.   3
  13.   3
  14.   -3
  15.   3.0
  16.   3.0
  17.   3.0
  18. 3.0
  19.   NaN
  20.   NaN
  21.   NaN
陷阱:












  
  1. public static final double POSITIVE_INFINITY = 1.0 / 0.0;
  2.   public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
  3.   public static final double NaN = 0.0d / 0.0;



文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/8745979

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。