舍入小数点

7

可能重复:
如何将小数点后的数字保留两位有效数字并四舍五入

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


在 JavaScript 中有一个 round 方法。 - Jahan Zinedine
我曾以为小数点已经是圆的了。而减号、加号和除号都是平的 :) 要想“四舍五入到100的倍数”,只需使用“Math.round()”函数:http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Math.html,代码如下:double x = round(y/100.0) * 100.0; - paulsm4
BigDecimal工作得很好,你可以创建一个像这个答案中的round(number,decimals)函数一样的函数。试试看,我不知道为什么它不能工作。https://dev59.com/TWox5IYBdhLWcg3w44Pb#8911683 - Jav_Rock
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")

0
首先,有库函数可以做到这一点,为什么不直接使用它们呢?请参见Math.round()。没有必要重新发明轮子。但是,如果你想的话,可以尝试以下方法。将一个double数四舍五入到百分位:
x = 0.01 * floor(x * 100.0)

将一个双精度浮点数四舍五入到十分位:

x = 0.1 * floor(x * 10.0)

将一个double型数四舍五入到10的k次方位:

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

任何语言(包括Java)的实现都应该很简单。问题在于它并没有真正地四舍五入,而是截断到您的位置。为了解决这个问题,在舍入之前,您可以将0.5 * 10^k添加到您的数字中。如果您只想向上舍入,请使用上面的版本,并在计算之前或之后添加10^k。

你不想使用round()而不是floor()吗?如果保留一位小数,我期望0.193会四舍五入为0.2。 - Dan Hardiker
@brainzzy 我讨论了如何使用基于10进制数字的floor()原语来实现与round()和ceiling()相同的功能。但本质上,如果他想要四舍五入到最近的数(而不是总是向上或总是向下),那么round()应该可以胜任。 - Patrick87

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接