如何解决在Java中将int转换为double,然后返回int
|| 快速提问。 这永远是真的吗?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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。