0

我的应用程序处理价格,我在这里面临一个小问题。我将分步解释清楚。

以下是我的输入和输出应该是。

输入 1.01 = 输出 1

输入 1.748 = 输出 1.75

输入 1.98 = 输出 2

输入 1.49 = 输出 1.5

输入 20.0 = 输出 2

0

我使用了以下代码,但我无法实现

    double calc = 1.98;
            DecimalFormat df = new DecimalFormat("#.##");  
            calc = Double.valueOf(df.format(calc));
            System.out.println(String.valueOf(calc).replaceAll("([0-9])\\.0+([^0-9]|$)", "$1$2"));

::> output is 1.98 which should be 2

double calc = 20.0;
        DecimalFormat df = new DecimalFormat("#.#");  
        calc = Double.valueOf(df.format(calc));
        System.out.println(String.valueOf(calc).replaceAll("([0-9])\\.0+([^0-9]|$)", "$1$2"));

 ::> output is 20 this is correct for me.

double calc = 2.01;
        DecimalFormat df = new DecimalFormat("#.##");  
        calc = Double.valueOf(df.format(calc));
        System.out.println(String.valueOf(calc).replaceAll("([0-9])\\.0+([^0-9]|$)", "$1$2"));

::> output is 2.01  Which should be 2.

以下我尝试过的代码。

4

2 回答 2

0

尝试这个。我希望它能满足您的所有要求。

public static void main(String[] args) {
    double d = 20.0;
    int decimalPlaces = getDecimalPlaces(d) - 1;
    double res = Math.round(d * Math.pow(10, decimalPlaces))/Math.pow(10, decimalPlaces); // Rounding
    String text = Double.toString(Math.abs(res));
    int integerPlaces = text.indexOf('.');
    if (getDecimalPlaces(res) == 1 && text.charAt(integerPlaces + 1) == '0') 
        System.out.println((int)res);
    else
        System.out.println(res);
}

private static int getDecimalPlaces(double d) {
    String text = Double.toString(Math.abs(d));
    int integerPlaces = text.indexOf('.');
    int decimalPlaces = text.length() - integerPlaces - 1; // To Round
    return decimalPlaces;
}
于 2013-11-01T06:21:36.387 回答
0

输入 1.01 = 输出 1

这意味着使用零位或一位小数。

输入 1.748 = 输出 1.75

这意味着添加 0.05 或可能的 0.005,然后使用两位小数。

输入 1.98 = 输出 2

此输出可以通过上述任一规则来描述。

输入 1.49 = 输出 1.5

这意味着添加 0.05 或可能的 0.005,然后使用一位小数。

输入 20.0 = 输出 20

这意味着使用零位或一位小数。

因此,您的示例并非所有相同规则的实例。我能理解的唯一意义是您只对 0.25 的粒度感兴趣,但这只是我的猜测。您需要先细化您的需求,然后才能实现它。

于 2013-11-01T06:09:39.650 回答