在转换int期间精度是否会稍微改变,以便在Java中加倍?

时间:2018-06-06 08:50:10

标签: java casting precision

我已阅读此内容 - Why Are Floating Point Numbers Inaccurate?

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

但是如果我将一个整数值转换为double,是否有机会在Java中略微改变double的精度?

我的意思是,

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

    System.out.println(d);

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

但是,由于Java中的double表示风格,是否有可能像3.000001一样进行精度更改?

2 个答案:

答案 0 :(得分:33)

不是int要加倍,但你可能需要长一倍(或int浮动):

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

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

答案 1 :(得分:5)

您可以iterate超过i,直到找到等于2**i的{​​{1}}双倍:

2**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.");
    }
}

确认接受的answer

请注意,在Javascript中,没有整数类型,而是使用双精度(它们被称为Loss of precision is greater than 1.0 for 2**53 when using double. s)。如果它们足够大,则连续的Number可以是equal to each other