Java Hot到小数点后四舍五入到逗号后的下一个5乘法

Java Hot到小数点后四舍五入到逗号后的下一个5乘法,java,math,double,decimal,comma,Java,Math,Double,Decimal,Comma,我想取最接近的十进制数。逗号后面的数字应该是5(逗号后面的两个数字)的乘法,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(Str

我想取最接近的十进制数。逗号后面的数字应该是5(逗号后面的两个数字)的乘法,
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);
}
publicstaticvoidmain(字符串[]args){
双重[]检查={4.985,4.37,2.14,4.41,5.29,4.17,2.07,6.64,5.21,2.34,4.89};
双[]结果={5.0,4.4,2.15,4.4,5.3,4.2,2.1,6.65,5.2,2.35,4.9};

对于(int i=0;i当最后一个数字大于或等于7,第二个数字小于3时,您的代码会有意外的输出。我检查了您的期望值表

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

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

可能重复的逻辑似乎与您的要求不匹配。例如,5.29,最后一个数字是9,然后将其更改为0,并将第二个数字增加为3,然后设置标志。然后,由于设置了标志,请检查第二个数字,即3,并将更改为0,然后得到结果5。这正是您得到的结果,但不匹配你的期望值……所以当最后一个数字大于或等于7,而第二个数字小于3时,你的代码出现问题。我检查了你的期望值表。你可以简单地删除第二个数字。是的,我认为这就是问题所在。但是对于某些情况,如4.98,它的工作方式应该是这样的。我需要什么条件来修复它?4.69应该become 4.7,但它变成了5.0,我认为您需要更多的代码来确保输入的数字是您想要的格式——第一个是数字,然后是点,后面至少有两个数字。