gpt4 book ai didi

java - double 混淆?

转载 作者:行者123 更新时间:2023-11-29 06:01:34 24 4
gpt4 key购买 nike

在回答 this 时问题,我得到了这些令人困惑的结果:

double d = 0.49999999999999990d; //output 0.4999999999999999 as expected
d = 0.49999999999999991d; //output 0.4999999999999999
d = 0.49999999999999992d; //output 0.49999999999999994
d = 0.49999999999999993d; //output 0.49999999999999994
d = 0.49999999999999994d; //output 0.49999999999999994 as expected
d = 0.49999999999999995d; //output 0.49999999999999994
d = 0.49999999999999996d; //output 0.49999999999999994
d = 0.49999999999999997d; //output 0.49999999999999994
d = 0.49999999999999998d; //output 0.5

为什么会出现这种行为?

注意:我只是通过打印 d; 得到了这些输出;我的意思是我用过:

System.out.println(d);

最佳答案

浮点类型不能精确表示所有实数。事实上,double 是一个 64 位浮点类型,因此只能表示 264 个不同的值……而且实数的数量是无限的。 (实际上,在 0.49999999999999990d0.49999999999999999d 之间有无限多个实数。)

您已经选择了一些介于所有 double 值集合中的连续值之间的数字。换句话说,您已经超出了 double 类型的精度限制。

你能做什么?好吧,获得更高精度的一种方法是使用 BigDecimal 类,它(理论上)可以为您提供 20 亿小数位数的精度。缺点是您的代码会更复杂……并且速度会明显变慢,具体取决于您使用的精度。

另一种方法是认识到您可能不需要那么高的精度。

关于java - double 混淆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9924518/

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