【JAVA】 关于Float的最小值
in with 0 comment

【JAVA】 关于Float的最小值

in with 0 comment

前言

在编写自定义折线图控件的时候,为了显示所有的点,需要计算所绘制的线的X轴、Y轴的最大最小值。于是在计算时默认赋予了初始值Float.MIN_VALUE,但是却发现当线上所有的点Y轴都比较小的时候,空间绘制出来的线条不正常

问题排查

当时计算极限值的代码如下

var minX = Float.MAX_VALUE
var minY = Float.MAX_VALUE
var maxX = Float.MIN_VALUE
var maxY = Float.MIN_VALUE

fun getLimitValue(pointList:List<Point>){
	pointList.forEach({ point ->
		if(point.x > maxX){
            maxX = point.x
        }
        if(point.y > maxY){
            maxY = point.y
        }
        if(point.x < minX){
            minX = point.x
        }   
        if(point.y > minY){
            minY = point.y
        }               
	})
}

观察发现当传入的点的集合如果所有的点都小于 0 的话,绘制出来的线段都出现了越界的问题。

检查了N遍代码,感觉没有什么问题呀。

无他法,打断点看看每一步的执行情况,但是却发现初始化时,maxXmaxY这两个变量值在初始化时的值为1.4E-45,也就是0.0000000000000000000000000000000000000000000014,这也就是说 Float.MIN_VALUE的值并不是所预期的最小值(预期中应该是Float所能表示的最小的数)。问题就在这里

问题原因

为什么Float.MAX_VALUE的值的却是一个很大的正数,但是Float.MIN_VALUE的值却不是一个很小的负数呢?

这就要从Float在计算机中的存储结构开始理解了。

01

Float.MIN_VALUE 对应的表示的是 2的负149次方

解决方法

所以说,其实Float.MIN_VALUE表达的并不是Float所能表示的最小数字,而是Float所能表示的最小精度 。

其实获得我们“预期中的” Float.MIN_VALUE的最小值也很简单,可以直接加负号,也就是 -Float.MAX_VALUE 即可获得我们“预期中的” Float.MIN_VALUE