7

可能重复:
将双精度数舍入到小数点后 2 位有效数字

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

   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 但不认为会有帮助,

4

2 回答 2

16

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

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

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

BigDecimal a = new BigDecimal("1.234");
BigDecimal b = a.setScale(2, RoundingMode.DOWN); // => BigDecimal("1.23")
于 2012-01-11T19:21:37.283 回答
0

首先,有库函数可以做到这一点,那么为什么不直接使用它们呢?请参阅 Math.round()。无需重新发明轮子。但是,如果您愿意,可以尝试以下操作。将双精度数舍入到百位:

x = 0.01 * floor(x * 100.0)

将双数四舍五入到第十位:

x = 0.1 * floor(x * 10.0)

要将双精度数舍入到 10^k 位:

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

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

于 2012-01-11T19:19:54.443 回答