使用Math.round函数将数字保留到小数点后一位?

55

我有这两个变量

double num = 540.512
double sum = 1978.8

然后我做了这个表情

double total = Math.round((num/ sum * 100) * 10) / 10;

但是最终结果为27.0。

实际上,我还有很多其他变量,当我在表达式中使用它们时,十分位总是得到0。


9个回答

114

我一段时间前创造的有用方法...

private static double round (double value, int precision) {
    int scale = (int) Math.pow(10, precision);
    return (double) Math.round(value * scale) / scale;
}

对我来说可以运行!double pi = 3.14159265; round(pi, 1) --> 3.1 round(pi, 4) --> 3.1416 - MAbraham1
1
@LeoDroidcoder 实际上,round(16.46, 1); 的预期结果是 16.5 - NBTX

29

试一试这个

例如

DecimalFormat df = new DecimalFormat("#.##");
df.format(55.544545);

输出:

55.54

2
这个可以工作,但是比使用Math.round(double a)慢得多。 - jpdymond
2
这不会四舍五入数字,它只是截取到两位小数。 - dguay
4
此答案应删除,因为它没有解答实际问题。此解决方案不进行四舍五入。 - basZero

26
Double toBeTruncated = new Double("2.25");

Double truncatedDouble = new BigDecimal(toBeTruncated).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();

它将返回2.3


7
顺便提一下,你可能不想在变量名中使用“truncated”,因为它与“round”有不同的含义。那么用“toBeRounded”和“roundedDouble”如何?我提到这个是因为看到你的回答时,我第一个想法是,“为什么他要截断,而不是四舍五入?” - ToolmakerSteve

24

2
另一个选项是根本不进行任何舍入,而是仅舍入数字的字符串显示。 - Hovercraft Full Of Eels
2
@haywire:实际上,使用System.out.printf()或String.format()等方法可以为您处理四舍五入。它不仅仅是截断精度,请参考我的答案。 - Micah Stairs
@MicahStairs 当然可以,但这似乎不是HovercraftFullOfEels的意思。 - Willi Mentzel
1
@haywire,听起来就像是原意。round 字符串显示还有其他解释吗?他没有说要截断,对吧? - ToolmakerSteve
@haywire 嗯,我的错 :) 误解了它。 - Willi Mentzel
显示剩余2条评论

13
如果您需要频繁进行此类操作,找到合适的库可能比自己实现更方便。以下是使用Precision从Apache Commons Math、使用Functions从Colt和使用Utils从Weka解决您问题的一行代码:
double value = 540.512 / 1978.8 * 100;
// Apache commons math
double rounded1 = Precision.round(value, 1);
double rounded2 = Precision.round(value, 1, BigDecimal.ROUND_HALF_UP);
// Colt
double rounded3 = Functions.round(0.1).apply(value)
// Weka
double rounded4 = Utils.roundDouble(value, 1)

Maven依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.5</version>
</dependency>

<dependency>
    <groupId>colt</groupId>
    <artifactId>colt</artifactId>
    <version>1.2.0</version>
</dependency>

<dependency>
    <groupId>nz.ac.waikato.cms.weka</groupId>
    <artifactId>weka-stable</artifactId>
    <version>3.6.12</version>
</dependency>

7
Double number = new Double("5.25");
Double tDouble = 
  new BigDecimal(number).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();

这将返回5.3。


2
BigDecimal.ROUND_HALF_UP从Java 9+开始已被弃用。请优先使用RoundingMode.HALF_UP - Ashley Frieze

5

我认为一种更易读的整洁替代方法,但由于双精度和字符串之间的转换,可能效率稍微低一些:

double num = 540.512;
double sum = 1978.8;

// NOTE: This does take care of rounding
String str = String.format("%.1f", (num/sum) * 100.0); 

如果您希望将答案作为双精度浮点数返回,您当然可以将其转换回来:

double ans = Double.parseDouble(str);

3
从字符串转换和转回来远比“有点不太”低效。如果问题确实是关于“显示一位小数”(可能是,但不确定),那么您已经得到了一个很好的答案。但是,如果这不是您想要的结果,那么这并不是一个好的方法。除非需要的结果是字符串,否则应该只对数字执行数字操作。 - ToolmakerSteve

5

你的方法是正确的,你只需要在十位数后面加上 .0 就可以解决问题!

double example = Math.round((187/35) * 10.0) / 10.0;

输出结果将会是:
5.3

我已经上传了示例。 - user8982259

4
DecimalFormat decimalFormat = new DecimalFormat(".#");
String result = decimalFormat.format(12.763);                // -->  12.7

1
由于问题涉及到四舍五入,这个结果不应该是12.8吗? - Bill K
我认为这个问题是关于四舍五入而不是截断的。答案应该是12.8。 - undefined

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