0){ // do s-6ren">
gpt4 book ai didi

java - float 大于或小于零

转载 作者:太空宇宙 更新时间:2023-11-03 13:01:38 27 4
gpt4 key购买 nike

我有以下代码,有时返回为真,有时不返回。

知道什么可能导致不同的结果吗?

0.00 字符串来自 JSON 对象。

(代码简化)

if(new Float("0.00")>0){
// do something
}

编辑:

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

编辑:

也许我应该澄清我如何获得值(value)。我可能完全是其他原因导致了问题,因为我阅读了 BigDecimal 并尝试使用它但无济于事。

使用以下代码从 JSON 提要(格式为 LT:0.000)中提取值:
price = new BigDecimal(stocksJSONArray.getJSONObject(i).getString("LT"));

然后为了测试价格是大于还是小于零,我使用了以下条件语句:
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.000000000000000000000000 ,不是 0.000000000000000000000001或类似的东西。

最佳答案

您的表达式将可靠地产生 false 的结果在 java 。

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

浮点数通常可以以与整数相同的方式比较小于 - 存在舍入错误的风险,但通过添加或减去随机小值无助于该错误。与平等的比较不同。

我建议你仔细检查你的事实和do more reading关于浮点行为。

编辑 :我在上面大大简化以回答原始问题。要回答对问题的编辑,我们需要更深入。

对于 任何操作在浮点数上,人们应该了解并考虑输入的精度和准确度,以及所需的输出准确度。有时任务是可解决的,有时则不是——输入的准确性可能不足以产生答案。

在您的情况下,精度为 32 位,其中 24 位是尾数和 8 位指数。这意味着这种数据类型可以安全地将 0.001 与 0.00100001 区分开来,但不能与 0.001000001 区分开来,正如您可以轻松看到的:

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

(请注意,如果您不强制转换为单精度比较,您会得到不同的结果。在这种情况下,计算将以 double 完成,并且数字将被安全地区分 - 直到您将它们更接近。)

因此,精度由数据类型决定。没有那么准确。确定输入精度通常比精度更具挑战性,因为它与数据类型无关,除了精度永远不会比精度更好。

就特定浮点类型的可表示性而言,数学实数可以在四种可能的情况下找到自己,这些情况对应于它以人类可读的十进制表示法作为文字出现时所接受的不同处理。
  • 它可能可以用二进制准确表示。例如,0 或 0.25。那么它就像整数变量中的整数一样准确。
  • 或者它可以近似地以对应于类型精度的精度来表示。例如,1/3 或 0.1 或 0.001。当所需的指数适合可用的指数位数时,就会发生这种情况,但是当数字的二进制扩展长于尾数或完全无限时。
  • 或者它可以近似地以严重扭曲的精度表示。这些是 denormal (次正常)数字。它不仅不准确,它的算术运算可能会慢到爬行,这通常被记录为正确的行为,即使是一个受人尊敬的 Java 编译器在看到这种类型的文字时也可能会出汗,但这是一个 bug .
  • 或者它根本不适合,编译器会拒绝文字太大。

  • 因此,就您而言,我们只有三个有效输入:0(准确)、0.001(近似值)和 -0.001(近似值),这使您的问题可以解决。 只需将您的数字与 0 字面量 进行比较(顺便说一句,这是准确的)和 您将始终获得预期的 boolean 值 (完全准确的输出)。

    然而,这取决于您的输入是直接从文字派生的。如果您的输入是 0.001、-0.001 和 (float)1000 * (float)0.001 - 1 之一,这将是一个不同的问题,您必须得到答案,例如:
    if (-0.00001 < x && x < 0.00001) // then x is zero 

    如果您允许任何输入,而不仅仅是这三个魔法值,并且对输入的准确性一无所知,那么这就是不可能完成的任务。甚至以 0.000000000... 开头的文字最后一些垃圾数字将被 Java 编译器转换为完全中性的零,在这种情况发生之后,再多的 Java 代码都无法从准确而美观的 0.00 中分辨出来。 ,或者如果你给下溢值加上一个减号会发生什么。变量中都是相同的、不准确的零、相同的位模式,而不是 3 个不同的值。

    关于java - float 大于或小于零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10386596/

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