将浮动值分配给double值

Naa*_*aaN 9 java floating-point double

我在提到这个 Oracle文档.在尝试执行以下操作时

 public static void main(String args[]){

    float f = 1.1f;
    double df = 1.1f;

    System.out.println("f=" + f);
    System.out.println("df=" + df);

    f = 1.5f;
    df = 1.5f;
    System.out.println("f=" + f);
    System.out.println("df=" + df);
 }
Run Code Online (Sandbox Code Playgroud)

输出是

f  = 1.1
df = 1.100000023841858
f  = 1.5
df = 1.5
Run Code Online (Sandbox Code Playgroud)

为什么第二行输出显示近似值.但不是第四线.如何计算价值?

Abi*_*san 4

不同之处1.5在于 double 可以精确表示 - 而1.1不能精确表示。

这是因为周期性数字,任何(不可约)分数,其中分母具有不在基数中出现的质因数,都需要在某个点之后周期性重复的无限多个数字。例如,在十进制中和1/4是有限的,因为和是 的素因数。但不是有限的,也不是或或,因为和不是 的因子。分母中素因数为 的分数在底数上可以是有限的,但在底数上却不是有限的——这是大多数浮点数新手用户困惑的最大根源。3/58/2025101/32/31/75/637105102

将无限多个实数压缩为有限数量的位数需要近似表示。虽然整数有无限多个,但在大多数程序中,整数计算的结果可以存储在 32 位中。相反,给定任何固定的位数,大多数实数计算将产生无法使用这么多位数精确表示的数量。因此,浮点计算的结果通常必须进行舍入,以适应其有限表示。这种舍入误差是浮点计算的特征。

检查这里了解更多详情

  • @starmole:打印浮点数的Java默认值是打印足够的数字来唯一标识其类型中的值。在 `float` 中,“1.1”就足够了,因为 `1.1f`(确切地说是 1.10000002384185791015625)比任何其他 `float` 更接近 1.1。在`double`中,“1.1”是不够的,因为`double` 1.100000000000000088817841970012523233890533447265625比1.10000002384185791015625更接近1.1,所以你需要更多的数字来接近1的值.10000002384185791015625。 (3认同)