可能重复:
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,但不认为这会有所帮助,
答案 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。