间隔中的圆数加倍,按步骤定义

时间:2018-05-29 09:15:26

标签: java double rounding

我有一些抽象的双倍间隔,按步骤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

2 个答案:

答案 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.75r = 0.25x/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)*rx舍入到最近的小数间隔r。需要乘数,因为r是每个小数单位的值。
    • 对于x = 0.7, r = 0.25Math.round(x/r)代表3个季度。必须乘以r=0.25才能获得x的舍入值。

答案 1 :(得分:1)

使用BigDecimalsetScale()进行回合。

但是它不能与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);
}