gpt4 book ai didi

Java:添加2个 float 并得到 double 结果

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

据我所知,双数在内存中保留 64 位。 float 保留 32 位。

我尝试了以下方法:

double result=0.1f+0.3f;
System.out.println(result);

结果打印 0.4000000059604645。数据是否来自下一个内存块(前 32 位和接下来的 32 位)?
难道是别的什么?

最佳答案

这一行:

double result=0.1f+0.3f;

首先将字符串 "0.1"和 "0.3"转换为 float 值,然后使用 float 的规则将两个 float 值相加,最后将结果转换为 double 进行赋值。将浮点文字转换为 float 值会引入舍入误差。 (就像 1/3 在基数 10 中具有无限重复扩展一样,1/10 和 3/10 在基数 2 中具有无限重复扩展,并且不能用 floatdouble 精确表示。) float 添加可能会引入更多错误(双关语)。从 floatdouble 的扩展扩展是准确的,但系统随后假设扩展的分辨率包含有意义的数据。

如果您希望使用 double 的规则完成加法,那么您需要首先通过强制转换或使用 double 文字将至少一个操作数转换为 double:

double result=0.1f+0.3d;

在上面,0.3将被转换为double到完整的double精度; 0.1 将转换为 float ,然后扩大为 double ,从而产生比 double 具有更多舍入误差的 0.1d 值。大多数编译器会在编译时执行此操作。

使用 Oracle 的 javac 编译器(版本 1.7.0_11,默认设置)编译此代码:

public class Foo1 {
public static void main(String[] args) {
double dff = 0.1f + 0.3f;
double dfd = 0.1f + 0.3d;
double ddd = 0.1d + 0.3d;
System.out.println("dff=" + dff);
System.out.println("dfd=" + dfd);
System.out.println("ddd=" + ddd);
System.out.println("dff==dfd: " + (dff == dfd));
System.out.println("dff==ddd: " + (dff == ddd));
System.out.println("dfd==ddd: " + (dfd == ddd));
System.out.println("ddd==0.4: " + (10*ddd == 4));
}
}

生成如下所示的字节码(使用 javap -c 进行反汇编):

ldc2_w        #2                  // double 0.4000000059604645d
dstore_1
ldc2_w #4 // double 0.4000000014901161d
dstore_3
ldc2_w #6 // double 0.4d
dstore 5

并产生以下输出:

dff=0.4000000059604645  
dfd=0.4000000014901161
ddd=0.4
dff==dfd: false
dff==ddd: false
dfd==ddd: false
ddd==0.4: true

最后一行显示“true”,因为 0.1d 和 0.3d 的表示误差以及加法的舍入误差(如果有)恰好以与 0.4d 的表示误差完全匹配的方式组合。如果将 0.3 更改为 0.2 (并将 10*ddd==4 更改为 10*ddd==3 ),事情就不会那么好了。

一般来说,无论使用 float 还是 double ,都会存在一些舍入误差,结果不太可能准确。为了扩展精度,您应该使用 BigDecimal 。如果您只需要看起来干净的输出,请使用格式说明符(例如,使用 System.out.printf()String.format() )。

您还应该阅读 What Every Computer Scientist Should Know About Floating-Point Arithmetic

关于Java:添加2个 float 并得到 double 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17618834/

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