当我们在java中的任何一个基本类型上使用MIN_VALUE函数时,它为我们提供了该类型的最小值。 但 在float和double的情况下,它返回最小正值虽然float和double也可以有负值。
答案 0 :(得分:29)
MIN_VALUE告诉你浮点数的精确程度,但不能表示它可以表示的数学最小值。他们应该把它命名为更好......
MAX_VALUE的负数是浮点数的最小值(同样是双数)。
您可以假设这与数字如何用二进制表示的原因有关:
Java float和double使用符号位表示负值/正值,而不是两个整数的补码表示。这意味着它的正负值具有相同的幅度,即。 - (最大正值)=负最大值因此,您不需要为浮点数定义实际的数学最小常量,因为您可以使用正的最大常量来确定负限值。对于整数,由于它们以二进制表示的方式,您需要2个不同的常量来定义最大值/最小值,即-max!= min。
了解更多信息http://people.uncw.edu/tompkinsj/133/numbers/Reals.htm
答案 1 :(得分:14)
MIN_VALUE
应该命名为EPSILON
,它是浮点数可以表示的最小正值。
因为float使用符号幅度编码,所以float可以表示的最低值为-MAX_VALUE
。
答案 2 :(得分:3)
java中float的最小值为正?为什么?
为什么他们选择命名这样的常数是无法回答的(由我们),因为决策时,SO上没有人在场。
此外,知道问题的答案并没有帮助,因为Float.MIN_VALUE
和Double.MIN_VALUE
的值不会改变,无论它们有多么“错误”。 (它会破坏使用这些常量的任何现有代码,而Java设计者只有在没有其他可行替代方案时才会这样做。单独留下它显然是一种可行的选择。)
我想,答案(即决定的真正原因)可能与开发全新编程语言的人有关。然而,无论如何,他们将不得不自己决定。 FWIW,我不会这样设计,但那不相关。
答案 3 :(得分:2)
可能的解释可能是Java只使用了与C ++相同的命名约定,后者又从C继承了名称。
Java受到C ++的影响,C ++共享同样令人困惑的命名模式。在C ++中,Float.MIN_VALUE
的类比是std::numeric_limits<T>::min()
,其定义为:
最小有限值。 对于具有非规范化的浮点类型(可变指数位数):最小正标准化值。
在C ++中,这是模板代码中潜在的错误来源,所以后来在C ++ 11中,他们添加了std::numeric_limits<T>::lowest()
,其定义为:
最小有限值。 (自C ++ 11以来) 对于整数类型:与min()相同。 对于浮点类型:依赖于实现;通常,max()的负数。
但是C ++并不是第一语言。这一切都回到C,它定义了FLT_MIN最小浮点值。
那么,为什么C选择不一致地定义浮点数和整数的最小值?
不确定,但它可能与对称有关(见this answer)。对于花车,您可以使用-FLT_MAX
(或-Float.MAX_VALUE
)。对于整数,否定最大值是不可移植的。事实上,在所有现代架构中都存在错误(-INT_MAX == INT_MIN + 1
应该保留)。