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

发布于 2024-11-15 11:21:25 字数 184 浏览 2 评论 0原文

快速提问。

这永远都是真的吗?

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

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

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

quick question.

Would this always be true?

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

Or I need to do rounding to be sure?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

故事与诗 2024-11-22 11:21:25

是的,所有可能的 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 来说,情况成立。 >!

Yes, all possible int values can round-trip to a double safely.

You can verify it with this code:

    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;
        }
    }

Note that I'm not using a normal for loop, because it would either skip Integer.MAX_VALUE or loop indefinitely.

Note that the same is not true for int/float or for long/double!

围归者 2024-11-22 11:21:25

如果您的计算机速度较慢或没有时间运行循环来自行检查,则 Java 语言规范的相关部分位于此处 § 5.1.2 扩大转换

以下 19 种基元类型的特定转换称为拓宽基元转换:

  • 字节到短整型、整型、长整型、浮点型或双精度型
  • 短整型、长整型、浮点型或双精度型
  • char 到 int、long、float 或 double
  • int 到 long、float 或 double
  • long 为浮动或双精度
  • 浮动到双倍

扩大基元转换不会丢失有关数值总体大小的信息。 事实上,从整型到另一种整型以及从 float 到 double 的转换根本不会丢失任何信息;数值完全保留。 [...]

(以下部分§ 5.1 .3 缩小原始转换 确保返回的方式 double -> 也不会丢失任何信息。)

If you're on a slow computer or don't have time to run the loop to check for yourself, the relevant part of the Java Language Specification is here § 5.1.2 Widening Conversions:

The following 19 specific conversions on primitive types are called the widening primitive conversions:

  • byte to short, int, long, float, or double
  • short to int, long, float, or double
  • char to int, long, float, or double
  • int to long, float, or double
  • long to float or double
  • float to double

Widening primitive conversions do not lose information about the overall magnitude of a numeric value. Indeed, conversions widening from an integral type to another integral type and from float to double do not lose any information at all; the numeric value is preserved exactly. [...]

(The following section § 5.1.3 Narrowing Primitive Conversions ensures that the way back, double -> int, doesn't loose any information either.)

且行且努力 2024-11-22 11:21:25

约阿希姆解决方案的变体。

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

A variation on Joachim's solution.

int i=Integer.MIN_VALUE;
do {
    if(i != (int)(double) i) throw new AssertionError(i + " != (int)(double) "+i);
} while(i++ < Integer.MAX_VALUE);

To find the smallest value which causes an error for a conversion to float.

int i = 0;
do {
    if(i != (int)(float) i) throw new AssertionError(i + " != (int)(float) "+i);
} while(i++ < Integer.MAX_VALUE);

prints

java.lang.AssertionError: 16777217 != (int)(float) 16777217
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文