java-浮点数大于或小于零

java-浮点数大于或小于零,第1张

概述我有以下代码,有时返回为true,有时不返回.任何想法可能导致变化的结果吗?0.00字符串来自JSON对象.(代码简化)if(newFloat("0.00")>0){//dosomething}编辑:我有一些浮点数,我想确定它是否为零,小于零或大于零.值可以是0.00、0.001或-0.001之类的值.如何确定它们是正

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

任何想法可能导致变化的结果吗?

0.00字符串来自JSON对象.

(代码简化)

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

编辑:

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

编辑:

也许我应该澄清我如何获得价值观.我可能完全是其他导致问题的原因,因为我阅读了有关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提要中读取的许多值,此代码将循环执行.从结果中可以看出,一些零价格被处理为大于零,而某些价格被处理为小于零.我怀疑其他原因导致了这里的问题?

我还进行了测试,以查看问题是否出在数据的准确性上.所以我这样做:

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

对于被识别为正数和负数的零,其跟踪值仍为0.000000000000000000000000,而不是0.000000000000000000000001或类似的值.

解决方法:

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

但是,假设零是例如-1除以加无穷大的结果.在这种情况下,它内部将表示为-0.00.在某些情况下,它仍将打印为零(无负号),而在其他情况下,其行为将不同于0.00.

浮点数通常可以用小于-的方式与整数进行比较-存在四舍五入误差的风险,但是通过添加或减去一个随机的小值无济于事.与平等比较有所不同.

我建议您仔细检查有关浮点行为的事实和do more reading.

编辑:我在上面大大简化了回答原始问题.为了回答对该问题的编辑,我们需要更深入地研究.

对于浮点数的任何运算,应该知道并考虑输入的精度和准确度以及所需的输出精度.有时任务可以解决,有时却不能解决-输入精度可能不足以产生答案.

在您的情况下,精度为32位,其中尾数为24位,指数为8位.这意味着该数据类型可以将0.00100001与0.001区别开来,而与0.001000001区别开来,您可以很容易地看到:

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

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

因此,精度取决于数据类型.不太准确.确定输入精度通常要比精度更具挑战性,因为它与数据类型无关,只是精度永远不会比精度好.

关于特定浮点类型的可表示性,数学实数可以在四种可能的情况下找到自己的位置,它们对应于以人类可读的十进制表示形式以字面值出现时所接受的不同处理.

>可以用二进制准确表示.例如,0或0.25.然后,它与整数变量中的整数一样准确.
>或可以近似表示,其精度与类型的精度相对应.例如1/3或0.1或0.001.当所需的指数适合可用的指数位数时,但是当该数字的二进制扩展数长于尾数或完全无穷大时,就会发生这种情况.
>或近似可表示,且准确性严重失真.这些是denormal(非正常)数字.这不仅是不准确的,而且它的算术运算可能会减慢到爬网的速度,这通常被记录为正确的行为,即使是受人尊敬的Java编译器,在看到这种类型的文字(可能是bug)时也会冒汗.
>否则根本就不合适,编译器会拒绝该字面量太大.

因此,在您的情况下,我们只有三个有效的输入: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个不同的值.

总结

以上是内存溢出为你收集整理的java-浮点数大于或小于零全部内容,希望文章能够帮你解决java-浮点数大于或小于零所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1085370.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存