将int转换为double然后返回到java中的int

时间:2011-06-14 09:59:57

标签: java type-conversion primitive

快速提问。

这总是如此吗?

int i = ...;
double d = i;
if (i == (int) d) ...

或者我需要进行四舍五入以确定?

if (i == Math.round(d)) ...

3 个答案:

答案 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 / floatlong / 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