Java 浮点数大于或小于零

Java 浮点数大于或小于零,java,android,Java,Android,我有下面的代码,有时返回true,有时不返回 知道是什么导致了结果的变化吗 0.00字符串来自JSON对象 (代码简化) 编辑: 我有一些浮点数,我想确定它是零,小于零还是大于零。这些值可以是0.00、0.001或-0.001。如何确定它们是正、负还是零 编辑: 也许我应该澄清我是如何得到这些值的。我可能完全是其他原因导致了这个问题,因为我读到了关于BigDecimal的文章,并试图使用它,但没有用 这些值是使用以下代码从JSON提要(其格式为LT:0.000)中提取的: price = new

我有下面的代码,有时返回true,有时不返回

知道是什么导致了结果的变化吗

0.00字符串来自JSON对象

(代码简化)

编辑:

我有一些浮点数,我想确定它是零,小于零还是大于零。这些值可以是0.00、0.001或-0.001。如何确定它们是正、负还是零

编辑:

也许我应该澄清我是如何得到这些值的。我可能完全是其他原因导致了这个问题,因为我读到了关于BigDecimal的文章,并试图使用它,但没有用

这些值是使用以下代码从JSON提要(其格式为LT:0.000)中提取的:

price = new BigDecimal(stocksJSONArray.getJSONObject(i).getString("LT"));
然后,为了测试price是否大于或小于零,我使用了以下条件语句:

if(price.compareTo(BigDecimal.ZERO)==1){
    // greater than zero
}
else if(price.compareTo(BigDecimal.ZERO)==-1){
    // less than zero
}
对于从JSON提要读取的许多值,该代码是循环的。从结果来看,一些价格为零的
price
被处理为大于零,一些被处理为小于零。我怀疑是其他原因造成了这里的问题

我还做了一个测试,看看问题是否出在数据的准确性上。所以我这样做了:

DecimalFormat frmt = new DecimalFormat("0.000000000000000000000000");
String formatted = frmt.format(stock.change);

对于被识别为正和负的零,它的跟踪值仍然是
0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000。您需要指定误差范围,如:

float result = new Float("0.00");
float expected = 0;
if (Math.abs(result - expected) < 0.00001)
...
float结果=新的浮点(“0.00”);
预期浮动=0;
if(数学绝对值(预期结果)<0.00001)
...

您的表达式将可靠地在Java中生成
false
的结果

但是,假设零是-1除以正无穷的结果。在这种情况下,它将在内部表示为,粗略地说,-0.00。在某些情况下,它仍将打印为零(不带减号),在其他情况下,它的行为与0.00不同

浮点数通常可以用与整数相同的方式进行小于的比较-存在舍入误差的风险,但随机小值的加或减都无助于该误差。这与平等的比较是不同的

我建议您仔细检查您的事实和有关浮点行为的信息

编辑:为了回答原来的问题,我正在大大简化上面的内容。要回答这个问题,我们需要更深入

< <强> >浮点数的任何操作< /强>都应该知道并考虑输入的精度和精度,以及期望的输出精度。有时任务是可解的,有时是不可解的——输入精度可能不足以产生答案

在您的例子中,精度是32位,其中24位是尾数,8位是指数。这意味着此数据类型可以安全地将0.001与0.00100001区分开来,但不能与0.001000001区分开来,因为您可以很容易地看到:

 System.out.println((float)0.001 < (float)0.001000001);

如果你允许任何输入,而不仅仅是这三个神奇的值,并且对输入的准确性一无所知,那么这就是不可能完成的任务。即使是一个以
0.000000000…
开头的文字,在结尾处有一些垃圾数字,它也会被Java编译器转换成一个完全中性的零,而在这种情况发生之后,再多的Java代码也无法从精确而漂亮的
0.00
中分辨出来,或者,如果在下溢值上加一个减号,会发生什么。它都是相同的、不准确的零,变量中的位模式相同,而不是3个不同的值。

您可以使用Math.signum()检查值是否等于、小于或大于零

我做的有点不同。我希望传感器显示读数为1。这就是我想到的

double a = y1;
                if((a-0)<1){
                    a=(1-a)+a;
                }
双a=y1;

如果((a-0)给出的答案是正确的,但不是在结果不应变化的情况下。您确定
0.00
始终按原样解析吗?您确定浮点初始化的值不是其他浮点操作的结果吗?请参阅以获取详细信息。请注意,我删除了我的答案,因为我在大多数情况下显然是错的关于我刚才所说的。在这方面有更多的专家。我决定“降级”我对一条评论的回答(并将其删减到唯一有用的部分)。+1感谢你更深思熟虑的回答。@AndrewThompson-感谢你的姿态,我认为我不配(我是一个热心的浮点回避者),以及你提供的有力的无意义参考。我的是一张备忘单。“备忘单”我很重视这些东西。它们可以解决大多数基本问题。:)谢谢你解释得很好的回答。然而,我开始怀疑我的问题可能与浮点或双精度值的准确性无关。我已经对上面的问题做了一些澄清,希望它能指出问题的根源?再次感谢。你说的对,我的表达式在Java中会可靠地生成false的结果。经过多次测试,我猜问题与浮动无关。但是谢谢你的回答,我从中学到了很多
if (-0.00001 < x && x < 0.00001) // then x is zero 
double a = y1;
                if((a-0)<1){
                    a=(1-a)+a;
                }