【问题标题】:Hot to round decimal to next multiplication of 5 after comma Java逗号Java后将小数四舍五入到5的下一个乘法
【发布时间】:2018-02-22 06:30:36
【问题描述】:

我想得到最接近的十进制数。逗号后面的数字应该是 5 的乘积(逗号后面有 2 个数字),1-3 向下舍入为 0,4-6 舍入为 5,7-9 为 0,并向上舍入(递增)数字的左侧.如果是 0,也跳过第三个数字。

例如

4.985 -> 5.0

4.37 -> 4.4

2.14 -> 2.15

4.41 -> 4.4

5.29 -> 5.3

4.17 -> 4.2

2.07 -> 2.1

4.64 -> 4.65

5.21 -> 5.2

2.34 -> 2.35

我已经尝试过了,但在某些测试中出错了。

public static void main(String[ ] args) {
    double[] check = {4.985, 4.37, 2.14, 4.41, 5.29, 4.17, 2.07, 6.64, 5.21, 2.34, 4.89};
    double[] results = {5.0, 4.4, 2.15, 4.4, 5.3, 4.2, 2.1, 6.65, 5.2, 2.35, 4.9};
    for(int i=0; i<check.length; i++){
        double res = getClosestValue(check[i]);
        System.out.println(check[i]+" should be "+results[i]+" got "+res+" so it is "+
                        assertEquals(res, results[i]));
    }
}

public static boolean assertEquals(double a, double b){
    return a==b;
}

public static double getClosestValue(double number) {
    String value = String.valueOf(number).substring(0, 4);
    int firstDigit = Character.getNumericValue(value.charAt(0));
    int secondDigit = Character.getNumericValue(value.charAt(2));
    int lastDigit = Character.getNumericValue(value.charAt(3));
    boolean secondChange = false;
    if (lastDigit <= 3) {
        lastDigit = 0;
    } else if (lastDigit >= 7) {
        lastDigit = 0;
        secondDigit++;
        secondChange = true;
    } else {
        lastDigit = 5;
    }
    if(secondChange){
        if(secondDigit <= 3){
            secondDigit = 0;
        } else if(secondDigit >= 7){
            secondDigit = 0;
            firstDigit++;
        }
    }
    String result = firstDigit + "." + secondDigit + (lastDigit != 0 ? lastDigit : "");
    return Double.parseDouble(result);
}

结果:

  • 4.985 应该是 5.0 得到 5.0 所以这是真的
  • 4.37 应该是 4.4 得到 4.4 所以这是真的
  • 2.14 应该是 2.15 得到 2.15 所以这是真的
  • 4.41 应该是 4.4 得到 4.4 所以这是真的
  • 5.29 应该是 5.3 得到 5.0 所以它是 false
  • 4.17 应该是 4.2 得到 4.0 所以它是 false
  • 2.07 应该是 2.1 得到 2.0 所以它是 false
  • 6.64 应该是 6.65 得到 6.65 所以这是真的
  • 5.21 应该是 5.2 得到 5.2 所以这是真的
  • 2.34 应该是 2.35 得到 2.35 所以这是真的
  • 4.89 应该是 4.9 得到 5.0 所以它是 false

我的代码缺少什么?有没有更好的方法来获得这个?

编辑: 这与标记重复的不是重复的,我试图在逗号后舍入 2 个数字,而不仅仅是 1 个数字

【问题讨论】:

  • 似乎逻辑不符合您的要求。例如 5.29,最后一位是 9,然后将其更改为 0,并增加第二位变为 3,并设置标志。然后,由于设置了标志,检查第二个数字,即 3,将变为 0,得到结果 5。这正是你得到的,但与你的期望不符......
  • 所以当最后一位大于或等于 7,第二位小于 3 时,您的代码有问题。我检查了您的期望表。您可以简单地删除 seconddigit
  • 是的,我认为这就是问题所在。但对于某些情况,如 4.98,它按应有的方式工作。我需要什么条件来解决这个问题?

标签: java math double decimal comma


【解决方案1】:

当最后一位大于或等于 7,第二位小于 3 时,您的代码有意外输出。我检查了您的期望表。

根据您的cmets,我认为您可以将相应的零件代码替换为以下代码:

if(secondChange){
    if (secondDigit == 10) {
        secondDigit = 0;
        firstDigit++;
    } 
}

【讨论】:

  • 4.69 应该变成 4.7,但它变成了 5.0
  • 我认为你需要更多的代码来确保输入的数字是你想要的格式——第一个是一个数字,然后是点,然后至少是两个数字。
猜你喜欢
  • 1970-01-01
  • 2021-03-13
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多