大家好。踩坑了,又踩坑了!这次踩到了一个特别无语的常识坑。知道真相的那一刻,整个人都麻木了。先放代码:privatestaticdoublecalculate(doublea,intb){returna/b;}复制代码,别问为什么不用BigDecimal计算,反正里面有类似这个的方法程序。正常使用没有问题:注意,我说的是“正常使用看起来还好”,非正常使用呢?当我看到输出是“Infinity”时,我什至揉了揉眼睛,认为自己太爱自己的工作,导致用眼过度,视力模糊。有一件事要说,我从来没有见过这东西。但是我知道这个词:在我有限的认知中,0不能作为约数。如果用作除数,则会抛出异常。但是这个简单的案例打破了我的认知。不仅没有抛出异常,还给了我一个“无穷大”。茫然中,我知道材料快来了。经过搜索,如果我在使用框架的过程中遇到问题,一般来说,我都是先自己调试一下,纠结一下是不是我的打开方式不对。但是问题太简单了,连调试的角度都找不到。该怎么办?只直接拿出程序员的祖传技能:面向浏览器编程。于是输入搜索关键字“JavaInfinity”,博客站点排名第一:我个人不是很喜欢这个站点,于是根据个人习惯再次搜索:找到了以下链接:www.cnblogs。com/zhisuoyu/p/...这篇文章知道了,原来在我的认知中,0作为除数会抛出如下异常,还有一个前提是“整数运算”:java.lang.ArithmeticException:/byzerodefinesDouble和Float中的两个常量“正无穷大”和“负无穷大”:现在我知道0可以用作浮点运算中的除数。但为什么?什么Java设计成这样,为什么不一视同仁呢?博客中没有写,但是我知道要找到这个问题的答案,我可以去这个地方:stackoverflow.com/所以我用关键字“JavaDoubleFloatInfinity”搜索:很容易找到这个链接:stackoverflow.com/questions/1...提问者问的问题是翻译的,和我之前遇到的问题一模一样:WhydoesdividingbyzerobyFloatorDoublenotthrowjava.lang.ArithmeticExceptionL:/零例外?本题高赞答案如下:该题的终极答案就隐藏在这个高赞答案中,小编为大家解析。揭开这个好评如潮的答案,其实只有一句话:简而言之,IEEE-754标准就是这么规定的,Java的Floating-PointOperations就是基于这个标准。其他部分均为参考。在这句话中,他提到了两个关键的东西:IEEE-754standardJava'sFloating-PointOperations,意思是Java的浮点运算是基于IEEE-754标准的。他给的超链接之一是Java语言规范:docs.oracle.com/javase/spec...Java语言规范说:你要问我为什么,我只能告诉你我符合国际规范IEEE754。所以,不要问:那么这个IEEE754是什么东西?我也不知道,所以看看吧:好家伙,年纪也不小了。IEEE代表InstituteofElectricalandElectronicsEngineers,电气和电子工程师协会。IEEE754的全称是IEEEStandardforFloating-PointArithmetic。表示由电气和电子工程师协会制定的浮点运算技术标准。标准,标准,你懂吗?一定要有一些标准,有些事情就好办了,不然就互相对抗,互相兼容,比较起来就不舒服。因此,该标准旨在解决不同浮点实现中的各种问题,这些问题使它们难以可靠地使用和移植。有了标准,大家都遵守,就好办了。该标准规定了如何处理异常:来吧,框架部分,和我一起大声朗读:除以零:对有限操作数的运算给出精确的无限结果,例如1/0或log(0)。默认情况下,返回±无穷大。对于“除以0”异常,IEEE754规定对有限操作数的操作将产生精确的无限结果,例如1/0或log(0)。默认情况下,返回±无穷大。那么问题又来了?为什么标准中会有这样的要求呢?在上面的高赞回答中,给出了这样一个链接:web.archive.org/web/2018011...这个问题的答案隐藏在这个链接中:请问:为什么除以零(或溢出,或在溢出下)不会停止程序或引发错误?我在下面给了一个很长的回复。试了几次才明白,发现有点跑题了。我真的不知道这是什么意思。我个人认为它的意思就是:这个东西被广泛使用。为了程序的稳定性,我不想抛出异常终止程序,而且用户应该知道我的“除以0是一个无穷大的数”这样的设置。那到底是为什么呢?好吧,别问了,就到此为止吧,再问是不礼貌的,看完你只需要记住一句话:在Java中,如果除数为0,可能不会抛出ArithmeticException,不要形成这么固化的思维,会影响您的故障排除方向。
