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
,因为Float
和Integer
都是Number
的子类型,如下所示
private static Number parseStringFormatNumber(String val)
//Based on your conditions return either Float or Integer values
你也可以让instanceof
算子对返回值做测试,得到返回值的准确类型。即Float
或Integer
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 可以返回浮点数还是整数?的主要内容,如果未能解决你的问题,请参考以下文章