我有一些抽象的双倍间隔,按步骤f.e。:
定义 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 - where interval == 0.1
0.0, 0.25, 0.5, 0.75, 1.0 - where interval == 0.25
0.0, 0.5, 1.0 - where interval == 0.5
Java是否有一些工具可以绕过" round"一些双倍到最接近的数字,根据间隔? f.e:
第一种情况 0.511111 - to 0.5
0.599999 - to 0.6
0.511111 - to 0.5
0.599999 - to 0.5
0.711111 - to 0.75
0.744444 - to 0.5
0.755555 - to 1.0
0.92222 - to 1.0
答案 0 :(得分:5)
Java具有可以将数字舍入到n位小数的工具,请参阅How to round a number to n decimal places in Java。要舍入到您指定的任何间隔,您可能必须手动使用Math.round
。
<强>公式:强>
给定间隔r
和圆值x
,一个简单的公式是:
x_rounded = Math.round(x/r)*r;
<强>示例:强>
double x = 0.59999;
double r = 0.25; // Quarters
x = Math.round(x/r)*r;
System.out.println(x); // Result is 0.5
double x = 0.59999;
double r = 0.1; // Tenths
x = Math.round(x/r)*r;
System.out.println(x); // Result is approximately 0.6
double x = 0.31421;
double r = 0.125; // Eighths
x = Math.round(x/r)*r;
System.out.println(x); // Result is exactly 0.375
<强>证明:强>
r
可以被认为是分数单位的值。
r = 0.25
时,小数单位为四分之一。x/r
表示组成x
的小数单位数。
x = 0.75
,r = 0.25
,x/r == 3
时,因为x
包含三个小数单位,即四分之一。 x/r
表示季度数。Math.round(x)
将x
舍入到最接近的整数值。同样,Math.round(x/r)
将x/r
舍入到该分数的最接近的整数倍。
x = 0.7, r = 0.25
,我们有x/r = 2.8
,代表2.8个季度。因此,Math.round(x/r)
将值四舍五入到最接近的四分之一。Math.round(x/r)*r
将x
舍入到最近的小数间隔r
。需要乘数,因为r
是每个小数单位的值。
x = 0.7, r = 0.25
,Math.round(x/r)
代表3个季度。必须乘以r=0.25
才能获得x
的舍入值。答案 1 :(得分:1)
使用BigDecimal
和setScale()
进行回合。
但是它不能与0.25
精度一起使用,但是你可以做一个解决方法,如下所示:
public BigDecimal round( BigDecimal value, BigDecimal precision )
{
return value.divide(precision, BigDecimal.ROUND_HALF_UP)
.round(BigDecimal.ROUND_HALF_UP)
.multiply(precision, BigDecimal.ROUND_HALF_UP);
}