我读过这个- Why Are Floating Point Numbers Inaccurate?
因此,有时由于浮点数的表示方式(用指数和尾数表示科学表示法),可以改变浮点数的精度。
但是,如果我将整数值转换为double,那么在Java中是否有可能稍微更改double的精度呢?
我是说,
int i = 3;
double d = (double) i;
System.out.println(d);我得到的3.0输出和我预期的一样。
但是,是否有可能因为Java的表示风格而像3.000001一样改变精度呢?
发布于 2018-06-06 08:53:10
不适用于int到double,但您可以长到双倍(或int用于浮动):
2^53-1 (或小于-2^53)的长都可以精确地用双倍表示;2^24-1 (或小于-2^24)的ints都可以精确地用浮点表示。这种限制的产生是因为用于表示尾数的位数(53倍,24浮点数)。
发布于 2018-06-06 11:52:43
您可以在iterate之上使用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.这证实了接受的answer。
注意,在Javascript中,不存在整数类型,而是使用了双值(它们被称为Numbers)。如果它们足够大,则连续的Numbers可以是equal to each other。
https://stackoverflow.com/questions/50716066
复制相似问题