在 Java 中,在转换 int 期间,精度是否会略有变化,以加倍?

2022-09-01 18:55:35

我已经读过这个 - 为什么浮点数不准确?

因此,有时浮点数的精度可以改变,因为它的表示风格(带有指数和尾数的科学记数法)。

但是,如果我将整数值转换为双精度值,那么在Java中是否有可能稍微改变double的精度?

我的意思是

    int i = 3;
    double d = (double) i;

    System.out.println(d);

我得到的输出正如我预期的那样。3.0

但是,有没有可能因为Java中double的表示风格而改变精度?3.000001


答案 1

不是让int加倍,但你可能会长到双(或int要浮点):

  • 并非所有大于(或小于 )的多头都可以用双精度来表示;2^53-1-2^53
  • 并非所有大于(或小于 )的整数都可以由浮点数精确表示。2^24-1-2^24

这种限制的产生是因为用于表示尾数的位数(双精度中为 53,浮点数为 24)。


答案 2

您可以循环访问,直到找到一个等于 :i2**i2**i + 1

import java.util.stream.IntStream;

public class PrecisionLoss
{
    public static void main(String[] args) {
        double epsilon = 1;
        Integer maxInt = IntStream.iterate(0, i -> i + 1)
                .filter(i -> Math.pow(2, i) == Math.pow(2, i) + epsilon)
                .findFirst().getAsInt();
        System.out.println("Loss of precision is greater than " + epsilon
                + " for 2**" + maxInt + " when using double.");
    }
}

它输出:

Loss of precision is greater than 1.0 for 2**53 when using double.

这证实了接受的答案

请注意,在Javascript中,没有整数类型,而是使用双精度值(它们称为s)。如果它们足够大,则连续的 s 可以彼此相等NumberNumber


推荐