最强面试题:float 一道伤了自己自尊的题目

Posted 码农搬砖_2020

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最强面试题:float 一道伤了自己自尊的题目相关的知识,希望对你有一定的参考价值。

public class FloatPrimitiveTest   
    public static void main(String[] args)   
        float a = 1.0f - 0.9f;  
        float b = 0.9f - 0.8f;  
        if (a == b)   
            System.out.println("true");  
         else   
            System.out.println("false");  
          
      

乍一看,这道题也太简单了吧?

1.0f - 0.9f 的结果为 0.1f,0.9f - 0.8f 的结果为 0.1f,那自然 a == b 啊。

但实际的结果竟然不是这样的,太伤自尊了。

float a = 1.0f - 0.9f; System.out.println(a); // 0.100000024 float
b = 0.9f - 0.8f; System.out.println(b); // 0.099999964

加上两条打印语句后,我明白了,原来发生了精度问题。

Java 语言支持两种基本的浮点类型:float 和 double ,以及与它们对应的包装类 Float 和 Double 。它们都依据 IEEE 754 标准,该标准用科学记数法以底数为 2 的小数来表示浮点数。

但浮点运算很少是精确的。虽然一些数字可以精确地表示为二进制小数,比如说 0.5,它等于 2-1;但有些数字则不能精确的表示,比如说 0.1。因此,浮点运算可能会导致舍入误差,产生的结果接近但并不等于我们希望的结果。

所以,我们看到了 0.1 的两个相近的浮点值,一个是比 0.1 略微大了一点点的 0.100000024,一个是比 0.1 略微小了一点点的 0.099999964。

Java 对于任意一个浮点字面量,最终都舍入到所能表示的最靠近的那个浮点值,遇到该值离左右两个能表示的浮点值距离相等时,默认采用偶数优先的原则——这就是为什么我们会看到两个都以 4 结尾的浮点值的原因。

以上是关于最强面试题:float 一道伤了自己自尊的题目的主要内容,如果未能解决你的问题,请参考以下文章

最强面试题:float 一道伤了自己自尊的题目

最强面试题:float 一道伤了自己自尊的题目

之前同事问到的一道python题目

一道有意思的“初始化”面试题

网摘一道百度2014年9月25日面试题(题目是网上看到的,代码是自己写的)

网摘一道百度2014年9月25日面试题(题目是网上看到的,代码是自己写的)