我已阅读此内容 - 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
一样进行精度更改?
答案 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。