“浮动”点意味着您的数字的小数部分的位数可以改变以“尽可能”地表示您的数字,因为它的大小受到限制。
让我们暂时忘记 float 数据类型的 4 个字节,并假设您的“浮点”类型最多可以存储 10 位数字加上负号。
这意味着您可以准确地表示从 :-9 999 999 999 到 +9 999 999 999 的数字。
但是,如果您想要一位小数,您可以准确地表示从-999 999 999.9 到+999 999 999.9 的数字。如您所见,范围已经有效地改变了。
现在,让我们通过讨论 significand 和 exponent 来正式化一下解释:
-
significand 包含您的有效数字
-
exponent 表示 10 乘数的指数,或者如果更简单的话,表示您必须移动小数点的位置(0 位于第一个有效数字之前)。李>
假设您的“浮点”数据类型在其 significand 中最多可以有 4 位数字,在其 exponent 中最多可以有 1 位数字,加上减号significand 和 exponent 中的符号。
您将能够表示从-0.9 999 * 10^9 = -999900000 到+0.999 9 * 10^9 = +999900000 的数字。正如您所看到的,虽然数字很大,但您无法准确表示大多数大数字,因为您只有 4 位数字可用于表示。这种精度损失可以通过表示非常小的数字的能力得到补偿,例如,您可以表示 0.999 9 * 10^-9 = 0.000 000 000 999 9。
这解释了为什么范围如此之大,尽管大小只有 4 个字节,如您的问题所述。
为了完善您对此事的了解,请将上述概念转换为二进制(您的典型float 使用 4 位作为 指数,23 位用于 有效位 和 1有效数字的符号位)。
维基百科是一个很好的起点。通常,编程目的的主要内容是了解在给定数据类型(您的“精度”)的情况下可以存储多少个十进制数字,因为这将决定哪种特定的十进制格式最适合您的目的。
有关详细信息,请参阅以下链接:
https://en.wikipedia.org/wiki/Floating-point_arithmetic#IEEE_754:_floating_point_in_modern_computers
请注意,理解二进制系统中浮点数的概念在信息技术中极为重要,因为即使是最简单的计算也会受到它的严重影响。
在计算机上表示的浮点数(二进制)例如是编写如下内容的原因:
public class MyClass {
public static void main(String args[]) {
double x=0.1f;
double y=0.2f;
double z=0.3f;
if(x+y == z) {
System.out.println("something");
}
else {
System.out.println("something else");
}
}
}
会反直觉地输出something else,但如果您开始使用数字或将类型更改为float,它将产生正确的输出。
所以请注意:您需要完全理解这个概念。