Java 如何将浮点值减半,如将4.8转换为4.5?
例如:如果值来自服务器(如4.8),我希望显示4.5级的评级。如果服务器值为5,我必须显示评级为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,如何得到最接近的浮点数,如
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。