我有以下问题。
我通过使用哈希表将一些数据存储在内存中(来自数据库查询):
Map<String,MyObject>
其中MyObject由3个数组组成:float [],int []和double []。 我使用Float.MIN_VALUE,Integer.MIN_VALUE和Double.MIN_VALUE来存储数据库中具有NULL值的值。
我需要处理输入哈希表并将输出存储在哈希表中
Map<String, Double> output
必须只包含NON NULL值。
所以,我进行这样的比较:
Double value = ... (get a value from MyObject)
if(value != Float.MIN_VALUE && value != Double.MIN_VALUE && value != Integer.MIN_VALUE){
// add to OUTPUT hash table
但if语句在值等于Float.MIN_VALUE时无法正常工作:第一个组件总是返回TRUE(意味着两个值不同)。
我也尝试了类似的东西
if(value != new Double(Float.MIN_VALUE))
但问题仍然存在。
任何人都可以建议我一个正确比较价值的解决方案吗?
编辑:使用类似的东西是否安全:String.valueOf(value).equals(String.valueOf(Float.MIN_VALUE))) ?
似乎有效。
答案 0 :(得分:2)
您应该使用double类提供的静态方法:
Double.isFinite(value);
Double.isInfinite(value);
Double.isNaN(value);
Double.compare(value, Double.MIN_VALUE)
答案 1 :(得分:0)
这篇文章已经有9个月了,但我的回复可能会帮助其他用户处理双打和浮动。 Fab我不知道你如何从你的对象获得float / double / int值,但是当你检查它时here:如果一个Object得到了 Float.MIN_VALUE ,它的值再次浮动或双倍肯定匹配 Float.MIN_VALUE :
Object obj = Float.MIN_VALUE; //1.40129846432481707E-45;
float floatVal = ((Number) obj).floatValue();
System.out.println("obj is a " + obj.getClass().getSimpleName()); // obj is a Float
boolean result = floatVal == Float.MIN_VALUE;
System.out.printf("%.60f == %.60f: %s.\n" , floatVal, Float.MIN_VALUE, result ); // true
即使我们将从对象获得的值赋给声明为double的变量,匹配仍然成立:
double doubleVal = ((Number) obj).doubleValue();
result = doubleVal == Float.MIN_VALUE;
System.out.printf("%.60f == %.60f: %s.\n" , doubleVal, Float.MIN_VALUE, result ); //true
如果我们没有明确地将 Float.MIN_VALUE 的值指定为Float:
obj = Float.MIN_VALUE; //1.40129846432481707E-45;
macths直到hold,即使obj的值被解释为Double:
floatVal = ((Number) obj).floatValue();
doubleVal = ((Number) obj).doubleValue();
Formatter fmt = new Formatter();
System.out.println("obj is a " + obj.getClass().getSimpleName()); // obj is a Double
result = floatVal == Float.MIN_VALUE;
System.out.println(fmt.format("%18.17e", floatVal) + " == " + fmt.format("%18.17e", Float.MIN_VALUE) + "? " + result ); // true
result = doubleVal == Float.MIN_VALUE;
System.out.println(fmt.format("%18.17e", doubleVal) + "= = " + fmt.format("%18.17e",Float.MIN_VALUE) + "? " + result ); // true
我希望这会对某人有所帮助!