浮点大于或小于零

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(使用前将#替换为@)

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

  • java - IBM-IEEE 双精度浮点字节转换

    我需要在 Java 中对字节数组进行 IBM IEEE 浮点转换 我能够使用成功地进行单精度浮点字节的转换http www thecodingforums com threads c code for converting ibm 370
  • Android - 如何使用操作创建通知[重复]

    这个问题在这里已经有答案了 我正在创建这样的通知 Notification Builder builder new Notification Builder context builder setContentTitle notifyMes
  • Java 线程 JavaDoc

    我编写了一个只能在特定线程上调用的方法 是否应该将标准注释或注释添加到方法的 javadoc 中来表示这一点 不知道有任何这样的标准注释 Java 并发实践 http www javaconcurrencyinpractice com 在第
  • 自 Java 7 以来 HttpServer 延迟 1 秒

    我们正在使用内部HttpServer项目中的类 用于通过 HTTP 在客户端和服务器之间交换数据 当我们切换到 Java 7 时 我们意识到结果交付存在延迟 我们可以将问题简化为以下示例 Class EchoServer创建上下文 echo
  • 如何构建 APK 和应用程序动态加载的单独库

    简短的总结是 如何构建 APK 和单独的库 我指的是某种形式的类集 理想情况下也是资源 例如 JAR AAR 或 DEX 文件 但不将这些库包含在应用程序 相反 应用程序在运行时加载它们 Detail 所以我的主要问题是如何构建这样的应用程
  • Android ViewPager - 在左侧和右侧显示页面预览

    我用的是安卓系统ViewPager 我想要做的是在左侧和右侧显示页面的预览 我已经知道在哪里可以使用否定pageMargin显示右侧的预览 setPageMargin 100 无论如何 我也可以显示左侧的预览吗 它基本上类似于我正在寻找的画
  • Eclipse 错误:“设置构建路径”遇到错误

    我正在使用一个名为 jtwitter 的 API 它有一个 jar 文件 jtwitter jar 我一直在使用它并使用 git 维护它 我把代码托管在github上 有些天 我没有碰过它的代码 今天 当我克隆我的 git repo 时 实
  • 如何使用二叉树中的递归来完成回溯

    我正在尝试插入一个二进制节点 我的代码很复杂 没有希望挽救它 所以我计划重写它 基本上我没有考虑回溯 也没有仔细考虑算法 我正在尝试使用顺序遍历插入二进制节点 但我不明白应该如何回溯 D B E A C F 我如何搜索根 D 的左子树 然后
  • 为 Android 编译时显示 FFMPEG 错误

    我正在尝试将 ffmpeg 添加到我的 android 项目中 我使用的是 ubuntu 14 04 操作系统 我正在关注此链接 Link https software intel com en us android blogs 2013
  • RecyclerView:禁用焦点变化引起的滚动

    TL DR我有一个RecyclerView of EditTexts 当用户注意力集中时EditText 1并点击EditText 2 我想EditText 2获得焦点 但我不想要ReyclerView滚动 我怎样才能实现这个目标 我正在尝
  • android.R.layout.simple_list_item_1是什么?

    在我看到的所有示例中 他们在创建 ArrayAdapter 时仅使用 android R layout simple list item 1 android R layout simple list item 1是什么 它只是一个名为sim
  • 随机关闭应用程序 - InputManagerService:收到 RemoteException 发送 setActive(false) 通知

    我有一个非常简单的Android应用程序 类似于手指画应用程序 我是 用手指在屏幕上画一些线条 我的问题是 应用程序随机关闭自己 让我回到 安卓主屏幕 我在 LogCat 上能看到的唯一日志就是这一行 Warning Tag InputMa
  • 如何将 onClick 侦听器附加到应用程序小部件上的列表视图项

    我喜欢向列表视图的每个项目添加一个 onClick 侦听器 但我尝试过的方法都不起作用 这是我的 RemoteViewsFactory public class MyRemoteViewsFactory implements RemoteV
  • Android - 将值从 sqlite 数据库加载到数组列表

    我是安卓新手 我有一个使用 SQLite DB 的应用程序 我需要将值从数据库推送到对象类型的数组列表 我使用的代码在这里给出 private ArrayList
  • 从应用程序打开无线设置

    我想直接从我的应用程序打开 设置 gt 无线和网络 我怎样才能做到这一点 尝试这个 startActivity new Intent android provider Settings ACTION WIRELESS SETTINGS 或者
  • 如何在Android AsyncTask中显示Toast?

    我正在尝试在我的initial background类中显示Toast 扩展为AsyncTask
  • AWS Java SDK 中 DynamoDB v2 的迁移详细信息?

    有没有人对新的命名空间进行了更改 com amazonaws services dynamodbv2 以及 AWS Java SDK 1 4 2 及更高版本 中 DynamoDB 的接口 本地二级指数的发布显然需要根据1 4 2 发行说明
  • java.lang.Object#getClass() 的 Eclipse 外部空注释

    我正在使用 Eclipse Mars 中提供的外部空注释工具 我正在尝试添加外部注释java lang Object getClass 但似乎无法正确签名 我尝试过以下变体 NonNull Class getClass L1java lan
  • 如何指示 yum 安装特定版本的 OpenJDK

    我尝试安装openjdk in the redhat服务器 如何安装指定版本 我要安装的版本是 11 0 4 使用以下命令安装的版本是11 0 6 yum install java 11 openjdk devel 曾与 yum showd
  • 术语“可序列化”是什么意思? [复制]

    这个问题在这里已经有答案了 不太确定我读过的定义可序列化实际上做了什么 import java io Serializable import java text StringCharacterIterator import java uti

随机推荐