繁体   English   中英

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

[英]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 / floatlong / 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM