gpt4 book ai didi

java - 为什么 4.9E-324/2.0 在 java 中返回 0.0

转载 作者:行者123 更新时间:2023-11-30 07:51:25 25 4
gpt4 key购买 nike

我正在写一个java程序。当我执行 4.9E-324/2 时,它返回 0.0。使用 BigDecimal 返回正确的值。我错过了什么吗?

double x = 4.9E-324/2.0; 
System.out.println(x); //result is zero
System.out.println(BigDecimal.valueOf(4.9E-324).divide(BigDecimal.valueOf(2.0)).toPlainString()); //result is a non-zero value

最佳答案

Double.MIN_VALUE的定义给出了答案。这是 double 可以容纳的最小正值,等于 2-1074,大约是 4.94 * 10-324。如果您将 4.9E-324 放入您的程序中,它足够接近 MIN_VALUE,编译器将四舍五入并使用该值。但是当你除以 2 时,结果对于 double 来说太小了,所以它被向下舍入为 0。

2-1074是最小值的原因与IEEE 754指定的64位 float 格式有关。 .这是一种标准格式,大多数处理器都有内置硬件来对这种格式的数字进行计算。 (相比之下,BigDecimal 表示为无限长度的 Java 数组,因此它能够以更高的精度处理数字;但是,对这些数字的算术是在软件中完成的,这使得它比计算慢得多在 double 上。)一个 64 位 double 由一个符号位、一个 11 位指数字段和一个 52 位尾数组成。对于“正常”值,指数字段在 1 到 2046 范围内,实际指数(2 的幂)与此偏移,因此指数范围为 -1022 到 1023。尾数为 1.xxxxx.. .xxx(二进制),其中 x 是尾数的 52 位。这种格式表示的值是 1.xxxxx...xxx * 2exponent。所以最小的正常值是 1 * 2-1022,或者 Double.MIN_NORMAL .如果指数字段为 0,并且尾数位不全为零,则浮点值是一个“非正规”数,其值为 2-1022 * 0.xxxxx...xxx,其中 x 是 52 位尾数字段。 (非正规数可以比普通数小,但它们不像普通 double 那样具有 52 位精度。)因此,最小可能值为 2-1022 * 0.00000...001;这个表达式的最后一部分是 2-52 因为尾数字段是 52 位长,所以最小值是 2-(1022+52) = 2-1074.

关于java - 为什么 4.9E-324/2.0 在 java 中返回 0.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47116513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com