[英]Cast int to double then back to int in java
快速提问。
这总是真的吗?
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
- 长时间浮动或加倍
- 浮动加倍
扩大原始转换不会丢失有关数值整体大小的信息。 实际上,从整数类型扩大到另一种整数类型以及从 float 到 double 的转换根本不会丢失任何信息。 数值被完全保留。 [...]
(下一节§ 5.1.3 Narrowing Primitive Conversions确保返回的方式 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.