负数float java_java-浮点数大于或小于零

您的表达式将在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个不同的值.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值