在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