关于java:舍入小数点

rounding decimal points

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Round a double to 2 significant figures after decimal point

我正在尝试将十进制度数(23.1248)转换为分钟样式的度数(23 7'29.3")。这就是我目前为止所拥有的:

1
2
3
4
5
   double a=23.1248;
   int deg=(int)a;//gives me the degree
   float b=(float) (a-deg);
   int min=(int) (b*60);//gives me the minutes
   double sec= (double) ((c*60)-min);//gives me my seconds

一切正常,但我想把秒数四舍五入到最接近的十分之一或百分之一。我研究过十进制格式,但不希望将其转换为字符串。我也看过bigdecimal,但不认为这有帮助,


放大后,尝试在数字上使用Math.round(double),然后再缩小。

1
2
double x = 1.234;
double y = Math.round(x * 100.0) / 100.0; // => 1.23

如果你想获得真正的重量级,也可以使用BigDecimal

1
2
BigDecimal a = new BigDecimal("1.234");
BigDecimal b = a.setScale(2, RoundingMode.DOWN); // => BigDecimal("1.23")

首先,有一些库函数可以做到这一点,那么为什么不直接使用这些函数呢?请参见math.round()。不需要重新发明轮子。不过,如果你想的话,你可以试试下面的方法。把一个双关调到百分位:

1
x = 0.01 * floor(x * 100.0)

四舍五入到第十位:

1
x = 0.1 * floor(x * 10.0)

要将双精度旋转到10^K位置:

1
x = 10^k * floor(x / 10^k)

任何语言(包括Java)的实现应该是直截了当的。有一个问题是,它不是真正的圆形,而是截断到您的位置。要解决这个问题,您只需在四舍五入之前将0.5*10^k添加到您的数字。如果您只想进行四舍五入,请使用上面的版本,并在计算之前或之后添加10^k。