Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将浮点值减半,如将4.8转换为4.5?_Java_Android_Kotlin_Floating Point_Double - Fatal编程技术网

Java 如何将浮点值减半,如将4.8转换为4.5?

Java 如何将浮点值减半,如将4.8转换为4.5?,java,android,kotlin,floating-point,double,Java,Android,Kotlin,Floating Point,Double,例如:如果值来自服务器(如4.8),我希望显示4.5级的评级。如果服务器值为5,我必须显示评级为5,这是可以的 我尝试了什么? 我尝试了一些本地的方法,比如 BigDecimal(libraryItem.ratingScore.toDouble()).setScale(2, RoundingMode.HALF_UP).toFloat() 我也试过了 Math.ceil(number*2)/2; 但这不是我想要的 所以,简单的问题是,如果值是4.8、3.6、2.7,如何得到最接近的浮点数,如

例如:如果值来自服务器(如4.8),我希望显示4.5级的评级。如果服务器值为5,我必须显示评级为5,这是可以的

我尝试了什么?

我尝试了一些本地的方法,比如

BigDecimal(libraryItem.ratingScore.toDouble()).setScale(2, RoundingMode.HALF_UP).toFloat()
我也试过了

Math.ceil(number*2)/2;
但这不是我想要的



所以,简单的问题是,如果值是4.8、3.6、2.7,如何得到最接近的浮点数,如4.5、3.5、2.5等 BigDecimal <代码>半舍入的方式,你可以考虑使用下面的公式:

double val = 4.8d;
double step = val > 0 ? -0.5d : 0.5d;
double valRounded = Math.round(2*val-step) / 2d;
valRounded
将如您所料为
4.5
。下面是一个循环,显示如何使用以下公式对值进行半舍入:

for (double val=4d; val <= 5.1d; val=val+0.1d) {
    double step = val > 0 ? -0.5d : 0.5d;
    System.out.println(val + "->" + Math.round(2*val+step)/2d);
}

4.0->4.0
4.1->4.0
4.2->4.0
4.3->4.0
4.4->4.0
4.5->4.5
4.6->4.5
4.7->4.5
4.8->4.5
4.9->4.5
5.0->5.0
5.1->5.0
for(双val=4d;val 0?-0.5d:0.5d;
系统输出打印项次(val+“->”+数学四舍五入(2*val+step)/2d);
}
4.0->4.0
4.1->4.0
4.2->4.0
4.3->4.0
4.4->4.0
4.5->4.5
4.6->4.5
4.7->4.5
4.8->4.5
4.9->4.5
5.0->5.0
5.1->5.0

在不使用Math Api的情况下,可以根据分数手动进行舍入,
大于或不大于一半,然后设置正确的值:

private double roundToHalfDown(double val) {
    double half = 0.5d;
    BigDecimal bigDecimalVal = new BigDecimal(String.valueOf(val));
    int intValue = bigDecimalVal.intValue();
    double fraction = bigDecimalVal.subtract(new BigDecimal(intValue)).doubleValue();
    if(val > 0) {
        val = fraction > half ? intValue + half : intValue;
    } else {    
        if(fraction == 0) {
            val = intValue;
        } else if(fraction > -half) {
            val = intValue - half;
        } else {
            val = intValue - 1;
        }   
    }
    return val;
}

roundToHalfDown(4.8);
Output : 4.5
roundToHalfDown(4.4);
Output : 4.0
对于简单的解决方案,您可以使用以下公式:

double valRounded = Math.round((val / 0.5d) - 0.5d) / 2d;
以下是输出结果:

val = -3.9 ---> valRounded = -4.0
val = -3.1 ---> valRounded = -3.5
val = 4.8 ---> valRounded = 4.5

您误解了HALF_DOWN。这并不意味着:DOWN to HALF。这意味着它通常会四舍五入到最接近的去干燥精度值,但如果要四舍五入的值正好是两个值之间的一半,它将始终选择四舍五入(或者,如果是向上舍入,则始终向上舍入;如果是偶数向上舍入,则始终向上舍入到具有未设置的最低有效位的值)。对于−.75,这就产生了−1,这可能不是我们想要的。@EricPostpSchil我甚至从来没有想到过负数。在这种情况下,我们可以直接对偏移量求反。将
double
转换为
int
可能会溢出。而且这段代码无法正确处理负值。@EricPostSchil我更新了答案,我从来没有想过负数Mbershave没有,我认为这个公式不适用于负数。我尝试了这个val=-3.9,得到了结果-3.5,虽然它假设为-4.0是的,但我看到问题是需要对半,但相反,负数的公式给出了四舍五入结果。就像val-3.1一样,得到了结果-3.0。