问题描述
||
快速提问。
这永远是真的吗?
int i = ...;
double d = i;
if (i == (int) d) ...
还是我需要四舍五入来确定?
if (i == Math.round(d)) ...
解决方法
是的,所有可能的
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
并非如此!
, 如果您的计算机运行缓慢,或者没有时间运行循环来进行自我检查,请参阅Java语言规范的相关部分,第5.1.2节“扩展转换”:
以下针对基本类型的19种特定转换称为扩展基本类型转换:
字节到short,int,long,float或double
短至int,long,float或double
char转换为int,long,float或double
int转换为long,float或double
长时间漂浮或翻倍
浮动到两倍
扩展原始转换不会丢失有关数值总体大小的信息。确实,从整数类型扩展到另一整数类型,再从浮点数转换为双精度的转换根本不会丢失任何信息。数值将精确保留。 [...]
(以下第5.1.3节“缩小原始转换”可确保返回的方法double-> int也不会丢失任何信息。)
, 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