Bic*_*ick 50 java floating-point
为什么原始浮点值可以是-0.0?那是什么意思?
我可以取消该功能吗?
当我有:
float fl;
Run Code Online (Sandbox Code Playgroud)
然后fl == -0.0
返回true
,所以fl == 0
.但是当我打印它时,它会打印出来-0.0
.
Old*_*eon 54
因为Java使用了IEEE浮点运算标准(IEEE 754),它定义了-0.0
何时应该使用它.
可表示的最小数字在次正规有效数中没有1位,并且由符号确定称为正或负零.它实际上表示在零和相同符号的最小可表示的非零数字之间的范围内的数字的舍入为零,这就是为什么它有一个符号,以及为什么它的倒数+ Inf或-Inf也有一个符号.
您可以通过添加来解决您的具体问题 0.0
例如
Double.toString(value + 0.0);
Run Code Online (Sandbox Code Playgroud)
请参阅:Java浮点数复杂性
涉及负零的操作
...
( - 0.0)+ 0.0 - > 0.0
-
当浮点运算导致负浮点数如此接近0而无法正常表示时,产生"-0.0".
Dar*_*rov 17
为什么原始浮点值可以是-0.0?
浮点数使用IEEE 754标准存储在存储器中,这意味着可能存在舍入误差.您永远无法使用有限资源存储无限精度的浮点数.
你永远不应该测试一个浮点数==到其他一些,即永远不会写这样的代码:
if (a == b)
Run Code Online (Sandbox Code Playgroud)
在哪里a
和b
是浮动.由于舍入错误,这两个数字可能会在内存中存储为不同的值.
您应该定义要使用的精度:
private final static double EPSILON = 0.00001;
Run Code Online (Sandbox Code Playgroud)
然后根据您需要的精度进行测试
if (Math.abs(a - b) < epsilon)
Run Code Online (Sandbox Code Playgroud)
因此,在您的情况下,如果要在给定精度中测试浮点数等于零:
if (Math.abs(a) < epsilon)
Run Code Online (Sandbox Code Playgroud)
如果您想在GUI中输出数字时格式化数字,您可以查看以下文章和NumberFormat类.
Java中的浮点类型在JLS:4.2.3浮点类型,格式和值中描述.
它谈到了这些特殊的价值观:
(...)四个值集中的每一个不仅包括上面赋予它的有限非零值,还包括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))
Run Code Online (Sandbox Code Playgroud)
是false
(但确实如此0.0 == -0.0
).
看看这里有更多这方面:Java浮点数错综复杂.
来自维基百科
\n\n\n\n\n浮点运算的 IEEE 754 标准(目前大多数支持浮点数的计算机和编程语言都在使用)需要 +0 和 \xe2\x88\x920。零可以被视为扩展实数轴的变体,例如 1/\xe2\x88\x920 = \xe2\x88\x92\xe2\x88\x9e 和 1/+0\n = +\xe2 \x88\x9e,除以零仅对于 \xc2\xb10/\xc2\xb10 和 \xc2\xb1\xe2\x88\x9e/\xc2\xb1\xe2\x88\x9e 未定义。
\n
我认为您不能或不需要取消该功能。无论如何,您都不能将浮点数与 == 进行比较,因为存在精度错误。
\n 归档时间: |
|
查看次数: |
22270 次 |
最近记录: |