Java 可以返回浮点数还是整数?

Posted

技术标签:

【中文标题】Java 可以返回浮点数还是整数?【英文标题】:Java Possible to Return Either Float or Integer? 【发布时间】:2014-02-19 07:04:03 【问题描述】:

是否可以有一个返回整数或浮点数的函数?如果可能的话,我想让这两个功能合二为一:

private static Integer parseStringFormatInt(String val)
    System.out.println(Integer.parseInt(val.substring(0, val.indexOf("."))));
    return Integer.parseInt(val.substring(0, val.indexOf(".")));

private static Float parseStringFormatFloat(String val)
    System.out.println(Float.parseFloat(val.substring(0, val.indexOf("."))));
    return Float.parseFloat(val.substring(0, val.indexOf(".")));

【问题讨论】:

为什么?如果您只在小数点前转换,为什么需要浮点数? 这是因为它从一个 Excel 文件中读取,该文件为 Integer 和 Float 输出“0.0”。 那么为什么您认为需要将两段代码合二为一呢? 注意 Excel 文件中没有整数或浮点数。有小数,有零个或多个小数位。 【参考方案1】:

或者,返回一个可区分的联合,例如Either<Integer, Float>。在一个小型库中,有一个针对 Java 8 的独立实现,“矛盾”:http://github.com/poetix/ambivalence

Either<Integer, Float> either1 = Either.ofLeft(23);
Either<Integer, Float> either2 = Either.ofRight(Float.valueOf("3.14"));
BigDecimal result1 = either1.join(BigDecimal::valueOf, BigDecimal::valueOf);
BigDecimal result2 = either2.join(BigDecimal::valueOf, BigDecimal::valueOf);

您可以从 Maven 中心获取它:

<dependency>
    <groupId>com.codepoetics</groupId>
    <artifactId>ambivalence</artifactId>
    <version>0.2</version>
</dependency>

【讨论】:

【参考方案2】:

我不会。我会让方法返回“float”,带有一个小的“f”,或者更可能是“double”;我会让它解析整个值而不需要任何子字符串操作;我会在需要它的呼叫站点将值转换为“int”,和/或从那里转换为 Integer、Float、Double ......无论您在呼叫站点需要什么。 p>

您会发现这比您接受的答案效率高出几个数量级,这只是一个穷人自我实现的运行时多态性,而您之前有编译时多态性。

但问题本身是非常可疑的。 Excel 文件中没有整数和浮点数。只有小数位为零或多个小数位。

【讨论】:

返回 float 或 int 有很高的风险让您的 Java 返回 NullPointerException,这是我真正不想要的。这些数字将被保存到带有整数/浮点数的对象中。 废话。返回 float、int、double 等有 zero 的 NullPointerException 风险。返回 Integer 或 Float 会带来这种风险,至少在理论上是这样。我真的很想知道你是否明白你在做什么。 你懂Java吗?返回 Float/ Integer/ Double 则风险为零。这就是为什么当人们编写 POJO 时,大多数编码人员会编写 private Integer x OR private Float x 或 private Double x 而不是 private int x/ private float x/ private double x。四处打听。 显然不知道“'float'和小'f'”之间的区别,这是我在这里推荐的,而不能null, 和 'Float',可以为 null。 NB 'private' 与它无关。问问自己。你在这里没有给任何人留下深刻印象。 是的,我明白你的意思,但这就是我不建议自己在这里使用它的原因,因为 int/float 向我抛出了我不想在我的程序中出现的 nullpointerexception。这就是我所指的:***.com/questions/2254435/…【参考方案3】:

将返回类型设为Number,因为FloatInteger 都是Number 的子类型,如下所示

private static Number parseStringFormatNumber(String val)
    //Based on your conditions return either Float or Integer values

你也可以让instanceof算子对返回值做测试,得到返回值的准确类型。即FloatInteger

if(returnedValue instanceof Float)

// type cast the returned Float value and make use of it

else if(returnedValue instanceof Integer)

// type cast the returned Integer value and make use of it

【讨论】:

【参考方案4】:

你可以回Number:

private static Number parseStringFormatNumber(String val)
    try 
        return Integer.valueOf(val.substring(0, val.indexOf(".")));
     catch (NumberFormatException e) 
        try 
            return Float.valueOf(val.substring(0, val.indexOf(".")));
         catch (NumberFormatException e2) 
            // handle invalid value (throw exception, return 0?)
        
    

【讨论】:

但这会给我一个错误:构造函数 *ObjectName*(Project, String, String, String, Date, Date, String, String, String, String, boolean, boolean, String, Number, Number, Number) 未定义,但我想要 *ObjectName*(Project, String, String, String, Date, Date, String, String, String, String, boolean, boolean, String, Float, Integer, Integer)。 @progricebowl 您还必须修改该构造函数以使用数字。 很难看出 NumberFormatException 是如何出现的。 不,我不打算更改为 Number,因为这是我必须遵循的规则 - 我必须分别使用 Float 和 Integer。 @EJP 如果无法解析字符串,所有数字解析方法都会抛出 NumberFormatExceptions。【参考方案5】:

您可以使用 Number 作为返回类型,或将方法设为通用

static <T extends Number> T parseString(String str, Class<T> cls) 
    if (cls == Float.class) 
        return (T) Float.valueOf(str);
     else if (cls == Integer.class) 
        return (T) Integer.valueOf(str);
    
    throw new IllegalArgumentException();

【讨论】:

谢谢,我会选择你的作为答案。 :D 为什么?它的效率比你现在的要低得多。

以上是关于Java 可以返回浮点数还是整数?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查字符串是浮点数还是整数?

关于整数输出为浮点数的问题

Java之浮点数运算

js 后端返回浮点数,前端用乘法或者除法处理,得到超常值

为啥将浮点数除以整数返回 0.0?

为啥整数除以零 1/0 会出错但浮点数 1/0.0 返回“Inf”?