在 Java 中,在 int 转换为双倍的过程中,精度会略有变化吗?



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

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

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

我的意思是

int i = 3;
double d = (double) i;
System.out.println(d);

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

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

不是 int 双倍,但你可以长期加倍(或 int 浮点(:

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

这种限制是由于用于表示尾数的位数(双打 53 位,浮点数 24 位(。

您可以遍历i,直到找到等于2**i + 12**i双精度

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 中,没有整数类型,而是使用双精度(它们称为Numbers(。如果它们足够大,则连续的Number可以彼此相等。

最新更新