舍入小数点

时间:2012-01-11 19:10:26

标签: java decimal-point

  

可能重复:
  Round a double to 2 significant figures after decimal point

我正在尝试将十进制度(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,但不认为这会有所帮助,

2 个答案:

答案 0 :(得分:13)

在缩放后尝试使用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")

答案 1 :(得分: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。