Java 基本浮点值如何可以是-0.0?这是什么意思?

Java 基本浮点值如何可以是-0.0?这是什么意思?,java,floating-point,Java,Floating Point,为什么原始浮点值可以是-0.0?这是什么意思? 我可以取消那个功能吗 当我有: float fl; 然后fl==-0.0返回true,fl==0。但当我打印它时,它会从 IEEE 754浮点运算标准(目前由 大多数支持浮点运算的计算机和编程语言 数字)同时需要+0和−0零可以被视为一个 扩展实数行的变体,使1/−0 = −∞ 和1/+0 = +∞, 除零仅对±0/±0和±∞/±∞. 我认为你不能也不需要取消这个功能。由于精度错误,您不能将浮点数与==进行比较 为什么原始浮点值可以是-0

为什么原始浮点值可以是-0.0?这是什么意思?
我可以取消那个功能吗

当我有:

  float fl;  
然后
fl==-0.0
返回
true
fl==0
。但当我打印它时,它会从

IEEE 754浮点运算标准(目前由 大多数支持浮点运算的计算机和编程语言 数字)同时需要+0和−0零可以被视为一个 扩展实数行的变体,使1/−0 = −∞ 和1/+0 = +∞, 除零仅对±0/±0和±∞/±∞.

我认为你不能也不需要取消这个功能。由于精度错误,您不能将浮点数与==进行比较

为什么原始浮点值可以是-0.0

浮点数存储在内存中,意味着可能存在舍入错误。您永远无法使用有限的资源存储无限精度的浮点数

您永远不应该测试浮点数==是否与其他浮点数相同,也就是说,永远不要编写这样的代码:

if (a == b)
其中
a
b
是浮动。由于舍入错误,这两个数字可能在内存中存储为不同的值

您应该定义要使用的精度:

private final static double EPSILON = 0.00001;
然后根据您需要的精度进行测试

if (Math.abs(a - b) < epsilon)
if(Math.abs(a-b)
因此,在您的情况下,如果要测试给定精度下的浮点数是否等于零:

if (Math.abs(a) < epsilon)
if(Math.abs(a)

如果您想在GUI中输出数字时对其进行格式化,可以查看和类。

Java中的浮点类型在JLS中描述:

它谈到了这些特殊的价值观:

(…)四个值集中的每一个不仅包括上文所述的有限非零值,还包括NaN值和四个值正零、负零、正无穷和负无穷。(……)

并有一些关于它们的重要注释:

正零和负零比较相等;因此,表达式0.0==-0.0的结果为真,0.0>-0.0的结果为假。但其他操作可以区分正零和负零;例如,1.0/0.0的值为正无穷大,而1.0/-0.0的值为负无穷大

您不能“取消”该功能,它是浮动工作方式的一部分

有关负零的更多信息,请查看维基百科条目

如果您想检查您拥有的零的“种类”,您可以使用以下事实:

(new Float(0.0)).equals(new Float(-0.0))
false
(但实际上,
0.0==-0.0


请在此查看更多内容:。

这是一篇关于如何在java/计算机中管理浮点数的好文章。

顺便说一句:当2.0-1.0可能产生不等于1.0的0.9999999999时,这对计算机来说是一个真正的痛苦。这在javascript表单验证中特别容易被发现。

因为Java使用了定义
-0.0
以及何时应该使用的

可表示的最小数字在次正常有效位中没有1位,称为正零或负零,由符号确定。它实际上表示从零到同一符号的最小可表示非零数字之间的数字四舍五入到零,这就是它有符号的原因,也是它的倒数+Inf或-Inf也有符号的原因

您可以通过添加
0.0

e、 g

见:

涉及负零的操作

(-0.0)+0.0->0.0

-

当浮点运算导致负数浮点数非常接近0,以致无法正常表示时,会生成“-0.0”


谢谢我需要在我的gui中打印数字,所以有时得到-0.0,有时得到0.0。我想永远不要出现-0.0。建议?@user450602,查看以下文章的格式:
Double.toString(value + 0.0);