如何在Java中将double舍入到两位小数?

72

这是我用来将一个双精度数舍入到小数点后2位的方法:

amount = roundTwoDecimals(amount);

public double roundTwoDecimals(double d) {
    DecimalFormat twoDForm = new DecimalFormat("#.##");
    return Double.valueOf(twoDForm.format(d));
}

如果amount=25.3569或类似于此的数,这个方法非常好用。但是如果amount=25.00或amount=25.0,那么结果会是25.0!我想做到同时四舍五入并格式化为2位小数。


这个函数在安卓上有时会返回逗号而不是点,因此 Double.valueOf() 会抛出异常。 - max4ever
21个回答

60

只需使用:(易如反掌)

double number = 651.5176515121351;

number = Math.round(number * 100);
number = number/100;

输出结果将为651.52


2
他将数字乘以100(因此651.517变为65151.7...),并四舍五入到最近的1(因此它变为65152),然后再除以100(651.52)。 - user1547050
14
你应该写成100.0而不是100,否则它会将其视为整数。 - Anatoly
6
不 - Java 从左到右进行计算,并扩展为所有操作数的最佳匹配。number 是一个双精度浮点数,因此与 number 进行计算的所有参与者都会被扩展为双精度浮点数! - Falco
2
Math.round(0 * 100) / 100 ==> 输出为0,而不是0.00 - Atul Kumbhar
3
Math.round(num * 100) / 100.00 - rexxar
显示剩余2条评论

24

您是否在处理金钱?创建一个字符串,然后再将其转换回去相当于循环套娃。

使用 BigDecimal。这个已经被广泛讨论过了。您应该有一个 Money 类,金额应该是 BigDecimal

即使您不是在处理金钱,也请考虑使用 BigDecimal


是的,我在处理金钱。但我所做的只是计算小费=(金额*百分比)/100,并显示小费和金额。我考虑过使用BigDecimal,但似乎为这样简单的计算而付出了很大的代价。在这种情况下,是否需要一个单独的货币类有些过头了吗? - sherry
3
不行。面向对象编程意味着类是解决类型问题的答案。问问自己:货币是一类对象吗?显然答案是肯定的。如果这个论点没有说服你,这里有两个原因:1.马丁·福勒在《分析模式》中的论点:单位需要建模,否则会出现问题;2.如果您需要,我可以给您提供一个货币类。 - Rob
我不是面向对象编程的专家,但你们能告诉我针对这个主题情况下,Money类应该包含或者做些什么吗?我真的想不出来。 - newbie
建议某人更改数据类型以解决问题的做法可能并不适用于大多数正在工作的开发者。 - Jamie M.
Rob 做出了许多推断。对于那个点踩者的问题,进行了深入分析!那你能否分析一下 OP 的问题呢?“我想,如果你手中唯一的工具是锤子,那么你会把所有东西都当成钉子来对待。” _马斯洛 - Jamie M.

19

使用数字占位符 (0),与 '#' 不同,前导/尾随的零将显示为不存在:

DecimalFormat twoDForm = new DecimalFormat("#.00");

1
嗯...那不起作用。我仍然得到25.0。 - sherry
14
我使用字符串格式化来修复这个问题,String result = String.format("%.2f", amount); - sherry
请问给我点踩的人可以留下评论吗? - Mitch Wheat

12

使用以下代码:

String.format("%.2f", doubleValue) // 根据需要自行更改数字2。

该代码可用于格式化浮点数,保留两位小数。


哥们儿,你真是个天才!我已经试了好久都没成功,而你的评论解决了问题。lblTotal.setText( String.format("$%.2f",tip) ); - Joseph Kreifels II

8

你不能将double类型的数字“舍入到[任何数量的]小数位”,因为double类型没有小数位。你可以将double转换成带有N个小数位的十进制字符串,因为十进制具有小数位,但是当你将其转换回来时,你又回到了double领域,即二进制小数位。


我知道。抱歉我没有表达清楚。 - sherry
@sherry,你表达得很清楚,但你只是描述了一个不可能实现的要求。 - user207421
被踩了。我认为作者的意图很明显。如果像其他答案一样,它有类似于“然而,你可以...”这样的内容,那就没问题了。 - Christopher Schneider
@ChristopherSchneider,“你可以...”这句话完全符合你的反对意见。 - user207421

6
这是我能做到的最简单的方式,但它比我看到的大多数示例更容易完成工作。
    double total = 1.4563;

    total = Math.round(total * 100);

    System.out.println(total / 100);

结果为1.46。

3

未找到所请求的URL在此服务器上未找到。 - Zbyszek

3

双倍数额 = 25.00;

数字格式化程序 = 新的十进制格式化程序("#0.00");

系统.打印输出(数字格式化程序.格式化(双倍数额));


1
你需要解释为什么这段代码能够解决问题,为什么它是最佳解决方案等等。 - Yulia V

3

你可以使用来自apache common的org.apache.commons.math.util.MathUtils

double round = MathUtils.round(double1, 2, BigDecimal.ROUND_HALF_DOWN);


2
首先声明一个 DecimalFormat 类的对象。注意 DecimalFormat 中的参数是 #.00,意味着精确保留 2 位小数。
private static DecimalFormat df2 = new DecimalFormat("#.00");

现在,将此格式应用于您的双精度浮点值:
double input = 32.123456;
System.out.println("double : " + df2.format(input)); // Output: 32.12

注意,如果输入为double input = 32.1;

那么输出将为32.10等等。


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