我已经读过这篇文章 - 为什么浮点数不准确?
因此,有时浮点数的精度可以更改,因为它的表示风格(带有指数和尾数的科学记数法(。
但是,如果我将整数值转换为双精度,是否有机会在 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 + 1
的2**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 中,没有整数类型,而是使用双精度(它们称为Number
s(。如果它们足够大,则连续的Number
可以彼此相等。