最强面试题: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 一道伤了自己自尊的题目的主要内容,如果未能解决你的问题,请参考以下文章