Java 方法 returns 双 |整数

Java method returns double | int

我需要一个接受字符串数字作为参数的方法,return如果有余数则为 double,如果为十进制则为 int。

我写了这样的代码:

 private double convertToNumber(String number) {
    double d = Double.parseDouble(number);
    if (d % 1.0 == 0) {
        return Integer.parseInt(number);
    } else {
        return d;
    }
}

但由于此方法的签名是双倍的,因此 return 在任何情况下都是双倍的。

请给我一些提示。

您的函数的签名只能是一 (1) 种类型,int 或 double,但不能同时是这两种类型。如果数字有小数部分 (true) 或 (false) 没有小数部分,您可以尝试将函数重新设计为 return 布尔值。

请记住整数不能包含小数部分,所以像

这样的运算
int a = 3 / 2;

会将 a 设置为 1 而不是 1.5

您不能有两种不同的 return 类型,也不能更改 Java 中方法的 return 类型。您可以使用不同 return 类型的不同方法签名,但随后您调用了两个单独的方法,这违背了您要完成的目的。

在你的情况下你能做的最好的事情是创建一个对象,你将传递给函数,你将在其中设置一个标志,告诉你要读取哪个值。您还将填充 int 值或 double 值。

当方法 return 的布尔标志将告诉客户端代码哪个值是要使用的正确值。

class MyConverter {
    public String number;
    public boolean isInt;
    public double doubleVal;
    public int intVal;
}

 private void convertToNumber(MyConverter conv) {
    double d = Double.parseDouble(conv.number);
    if (d % 1.0 == 0) {
        conv.isInt = true;
        conv.intVal = Integer.parseInt(number);
    } else {
        conv.doubleVal = d;
    }
}

您最好的办法是创建一个基础 class 和两个 class 扩展第一个 class.

IntegerClass 具有整数属性,FloatClass 具有浮点属性。然后在方法中根据字符串设置 IntegerClass 或 FloatClass,但 returns BaseClass。

然后使用 instanceOf 确定返回哪个。

为什么不return Number 来自你的方法:

private Number convertToNumber(String number) {
    double d = Double.parseDouble(number);
    if (d % 1.0 == 0) {
        return Integer.parseInt(number);
    } else {
        return d;
    }
}

IntegerDouble 都是 Number 的子类。

我不确定我是否理解 returning doubleint 的意图,因为我知道单个函数不可能 return不同的数据类型。

我想我从您的示例代码中了解到,如果一个字符串(例如,“123.0”与尾随零的数量无关)从 [=] 传递到 CalculatorEngine 20=] 您提供,您希望它被视为 int 并且数学运算符使用 intdouble 执行计算(因为 currentTotal 是 double).

现在,在完成所有计算后,如果 currentTotal 以 .0 结尾,那么您可能希望将其也视为 int 并删除该点,否则保留该点。

如果我理解正确,我认为 CalculatorEngine 可能是这样的:

public static void main(String[] args) {
    CalculatorEngine ce = new CalculatorEngine();
    ce.equal("1.01");
    ce.add("12");
    System.out.println(ce.getTotalString());
    ce.subtract("0.01");
    System.out.println(ce.getTotalString());
    ce.multiply("100.00000");
    System.out.println(ce.getTotalString());
    ce.divide("123");
    System.out.println(ce.getTotalString());
}

public static class CalculatorEngine {
    private enum Operator {
        ADD, SUBTRACT, MULTIPLY, DIVIDE
    }

    private double currentTotal;

    public CalculatorEngine() {
        currentTotal = 0;
    }

    public String getTotalString() {
        return currentTotal % 1.0 == 0 
                ? Integer.toString((int)currentTotal) 
                : String.valueOf(currentTotal);
    }

    public void equal(String number) {
        currentTotal = Double.parseDouble(number);
    }

    public void add(String number) {
        convertToDouble(number, Operator.ADD);
    }

    public void subtract(String number) {
        convertToDouble(number, Operator.SUBTRACT);
    }

    public void multiply(String number) {
        convertToDouble(number, Operator.MULTIPLY);
    }

    public void divide(String number) {
        convertToDouble(number, Operator.DIVIDE);
    }

    public void changeSign(String number) {
        Double d = Double.parseDouble(number);
        currentTotal = d * (-1);
    }

    public void dot(String number) {
        // todo
    }

    private boolean isDouble(String number) {
        double d = Double.parseDouble(number);
        return d % 1.0 != 0;
    }

    private void convertToDouble(String number, Operator operator) {
        double dblNumber = Double.parseDouble(number);
        switch (operator) {
            case ADD:
                add(dblNumber);
                break;
            case SUBTRACT:
                subtract(dblNumber);
                break;
            case MULTIPLY:
                multiply(dblNumber);
                break;
            case DIVIDE:
                divide(dblNumber);
                break;
            default:
                throw new AssertionError(operator.name());   
        }
    }

    private void add(double number) {
        currentTotal += number % 1.0 == 0 ? (int)number : number;
    }

    private void subtract(double number) {
        currentTotal -= number % 1.0 == 0 ? (int)number : number;
    }

    private void multiply(double number) {
        currentTotal *= number % 1.0 == 0 ? (int)number : number;
    }

    private void divide(double number) {
        currentTotal /= number % 1.0 == 0 ? (int)number : number;
    }
}

结果:

13.01
13
1300
10.56910569105691