浮点大于或小于零

2024-01-29

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

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

0.00 字符串来自 JSON 对象。

(代码简化)

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

EDIT:

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

EDIT:

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

使用以下代码从 JSON feed(格式为 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 feed 中读取的许多值进行循环。而从结果来看,一些price其中零被处理为大于零,一些被处理为小于零。我怀疑是不是有其他原因导致了这里的问题?

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

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

对于被识别为正数和负数的零,其迹值仍然是0.000000000000000000000000, not 0.000000000000000000000001或类似的东西。


您的表达式将可靠地产生以下结果false在爪哇。

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

通常可以按照与整数相同的方式比较浮点数是否小于 - 存在舍入误差的风险,但通过添加或减去随机小值并不能解决该错误。这与平等比较不同。

我建议你仔细检查你的事实并多读书 http://www.concentric.net/~ttwang/tech/javafloat.htm关于浮点行为。

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

For 任何操作关于浮点数,人们应该了解并考虑精确 and accuracy输入的数量,以及期望的准确度的输出。有时任务是可以解决的,有时却不是——输入的准确性可能不足以产生答案。

就你而言,精确是32位,其中24位是尾数,8位指数。这意味着该数据类型可以安全地区分 0.001 和 0.00100001,但不能区分 0.001000001,如您所见:

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

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

因此,精度由数据类型决定。不太准确。输入精度通常比精度更难确定,因为它与数据类型无关,只是精度永远不会比精度更好。

就特定浮点类型的可表示性而言,数学实数可能处于四种可能的情况下,这些情况对应于当它以人类可读的十进制表示法作为文字出现时所接受的不同处理。

  • 它可以用二进制准确地表示。例如,0 或 0.25。那么它就和整数变量中的整数一样准确。
  • 或者它可以用与类型的精度相对应的精度来近似表示。例如,1/3 或 0.1 或 0.001。当所需的指数适合可用的指数位数,但当数字的二进制扩展比尾数长或完全无限时,就会发生这种情况。
  • 或者它可以近似地表示,但精度却严重扭曲。这些都是denormal http://en.wikipedia.org/wiki/Denormal_number(次正规)数字。它不仅不准确,而且它的算术运算可能会慢得像爬行一样,这通常是记录在案的正确行为,甚至一个受人尊敬的 Java 编译器在看到这种类型的文字时也会有点出汗,但这是一个bug http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/.
  • 或者它根本不适合,编译器会因为太大而拒绝该文字。

因此,在您的情况下,我们只有三个有效输入:0(准确)、0.001(近似)和-0.001(近似),这使得您的问题可以解决。只需将您的数字与 0 文字进行比较(顺便说一下,这是准确的)和你总是会得到预期的布尔值(完全准确的输出)。

然而,这取决于您的输入是直接从文字派生的。如果您的输入是 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 个不同的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浮点大于或小于零 的相关文章

  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • Android Studio 与本地网络共享上的项目文件

    这是我的设置 Android Studio 项目文件位于 Ubuntu 14 10 盒子上的共享文件夹中 尝试在 Windows 8 机器上运行 Android Studio 1 0 2 并将 U 驱动器映射到包含项目文件的 Ubuntu
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • Android 2.3 模拟器在更新位置时崩溃

    我正在使用 Eclipse 编写和调试 Android 应用程序 我需要做的事情之一是更新设备的位置 因此我尝试使用模拟器控制窗口中的位置控制面板 在 手动 选项卡上 我选择 十进制 输入有效的纬度和经度 然后单击 发送 不幸的是 接下来发
  • 我应该释放或重置 MediaPlayer 吗?

    我有自己的自定义适配器类 称为 WordAdapter 并且我正在使用媒体播放器 名为pronounce WordAdapter 类中的全局变量 我有不同的活动 其中每个列表项都有线性布局 名为linearLayout 我正在设置onCli
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • Android 中的处理程序与异步调用

    目前我正在使用处理程序来调用 Web 服务方法以使其在后台运行 问题是它需要更多的时间来给出响应 在性能方面似乎更昂贵 现在我计划使用异步调用 哪一个是最好的 Android 中的处理程序和异步调用有什么区别 请帮我想出一个最好的解决方案
  • 在命令行上卸载 Android SDK 的选定部分

    这与 卸载旧的 Android SDK 版本 https stackoverflow com questions 15182377 uninstall old android sdk versions 除非我想在无头 Linux CI 服务
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • Android:如何从网络异步获取搜索建议?

    我创建了一个可搜索的活动 现在 我想添加从网络服务获取的搜索建议 我想异步获取这些建议 根据添加自定义建议 http developer android com guide topics search adding custom sugge
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐