java中float的min值为正是为什么?

当我们在java中的任何一个基本类型上使用MIN_VALUE函数时,它为我们提供了该类型的最小值。 但是在float和double的情况下,它返回最小正值,虽然float和double也可以有负值。

MIN_VALUE告诉您浮点数的精确程度,但不能表示它可以表示的数学最小值。 他们应该把它命名为更好……

MAX_VALUE的负数是浮点数的最小值(同样为double)。

您可以假设这与数字在二进制中的表示方式有关:

Java float和double使用符号位表示负值/正值,而不是两个整数的补码表示。 这意味着它的正负值具有相同的幅度,即。 – (最大正值)=负最大值 因此,您不需要为浮点数定义实际的数学最小常量,因为您可以使用正的最大常量来计算负限。 对于整数,由于它们以二进制表示的方式,即-max!= min,因此需要2个不同的常量来定义最大值/最小值。

有关更多信息,请访问http://people.uncw.edu/tompkinsj/133/numbers/Reals.htm

MIN_VALUE应命名为EPSILON它是float可以表示的最小正值。

因为float使用符号幅度编码,所以float可以表示的最低值是-MAX_VALUE

java中float的min值为正是为什么?

为什么他们选择这样的常数命名是无法回答的(由我们),因为做出决定时SO上没有人在场。

此外,知道问题的答案并没有帮助,因为Float.MIN_VALUEDouble.MIN_VALUE的值不会改变,无论它们有多么“错误”。 (它会破坏使用这些常量的任何现有代码,而Java设计者只有在没有其他可行替代方案时才会这样做。单独留下它显然是一种可行的选择。)

我想,答案(即决定的真正原因) 可能与开发全新编程语言的人有关。 然而,无论如何,他们将不得不自己决定。 FWIW,我不会这样设计,但那不相关。

可能的解释可能是Java只使用了与C ++相同的命名约定,C ++又从Cinheritance了名称。

Java受到C ++的影响,C ++共享相同的混淆命名模式。 在C ++中, Float.MIN_VALUE的类比是std::numeric_limits::min() ,定义如下:

最小有限值。 对于具有非规范化的浮点类型(可变指数位数):最小正标准化值。

在C ++中,它是模板代码中潜在的错误源,因此后来在C ++ 11中,他们添加了std::numeric_limits::lowest() ,定义如下:

最小有限值。 (自C ++ 11开始)对于整数类型:与min()相同。 对于浮点类型:依赖于实现; 通常,max()的负数。

但是C ++并不是第一语言。 这一切都回到C,它将FLT_MIN定义为最小浮点值。

那么,为什么C选择不一致地定义浮点数和整数的最小值?

不确定,但它可能与对称性有关(见这个答案 )。 对于浮点数,您可以使用-FLT_MAX (或-Float.MAX_VALUE )。 对于整数,否定最大值是不可移植的。 事实上,在所有现代架构中都存在错误(其中-INT_MAX == INT_MIN + 1应该成立)。