快速提问。
这总是如此吗?
int i = ...;
double d = i;
if (i == (int) d) ...
或者我需要进行四舍五入以确定?
if (i == Math.round(d)) ...
答案 0 :(得分:7)
是的,所有可能的int
值都可以安全地往返double
。
您可以使用以下代码进行验证:
for (int i = Integer.MIN_VALUE; ; i++) {
double d = i;
if (i != (int) d) {
throw new IllegalStateException("i can't be converted to double and back: " + i);
}
if (i == Integer.MAX_VALUE) {
break;
}
}
请注意,我没有使用普通的for
循环,因为它会跳过Integer.MAX_VALUE
或无限循环。
请注意,对于int
/ float
或long
/ double
,不为真!
答案 1 :(得分:1)
如果您使用的是慢速计算机或者没有时间运行循环来自行检查,那么Java语言规范的相关部分就在§ 5.1.2 Widening Conversions:
以下19种关于基本类型的特定转换称为扩展基元转换:
- byte to short,int,long,float或double
- 简称为int,long,float或double
- char to int,long,float或double
- int to long,float或double
- 长期漂浮或加倍
- 浮动加倍
扩展原始转换不会丢失有关数值总体大小的信息。 实际上,从整数类型扩展到另一个整数类型以及从float到double的转换根本不会丢失任何信息; 数值完全保留。 [...]
(以下部分§ 5.1.3 Narrowing Primitive Conversions确保返回的方式,double - > int,也不会丢失任何信息。)
答案 2 :(得分:0)
Joachim解决方案的变体。
int i=Integer.MIN_VALUE;
do {
if(i != (int)(double) i) throw new AssertionError(i + " != (int)(double) "+i);
} while(i++ < Integer.MAX_VALUE);
查找导致转换错误的最小值。
int i = 0;
do {
if(i != (int)(float) i) throw new AssertionError(i + " != (int)(float) "+i);
} while(i++ < Integer.MAX_VALUE);
打印
java.lang.AssertionError: 16777217 != (int)(float) 16777217