使用Math.round舍入到一个小数位?

use*_*542 33 java decimal rounding

我有这两个变量

double num = 540.512
double sum = 1978.8
Run Code Online (Sandbox Code Playgroud)

然后我做了这个表达

double total = Math.round((num/ sum * 100) * 10) / 10;
Run Code Online (Sandbox Code Playgroud)

但我最终以27.0结束.

事实上我有很多其他变量,当我在表达式中使用它们时,我总是在第十个位置得到0.

jpd*_*ond 86

我刚才创建的有用方法......

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


小智 23

试试这个

例如

DecimalFormat df = new DecimalFormat("#.##");
df.format(55.544545);
Run Code Online (Sandbox Code Playgroud)

输出:

55.54
Run Code Online (Sandbox Code Playgroud)

  • 该答案应删除,因为它不能解决实际问题。此解决方案无法解决。 (3认同)
  • 这可行,但比使用 Math.round(double a) 慢得多 (2认同)
  • 这不会四舍五入。它只是截断为两位小数。 (2认同)

rge*_*man 15

Math.round方法返回一个long(或者int如果你传入一个float),Java的整数除法是罪魁祸首.将其转换为a double,或double在分割时使用文字10.或者:

double total = (double) Math.round((num / sum * 100) * 10) / 10;
Run Code Online (Sandbox Code Playgroud)

要么

double total = Math.round((num / sum * 100) * 10) / 10.0;
Run Code Online (Sandbox Code Playgroud)

那你应该得到

27.3
Run Code Online (Sandbox Code Playgroud)

  • 1+另一种选择是根本不进行任何舍入,而是仅舍入数字的字符串显示. (2认同)
  • @haywire:实际上,使用System.out.printf()或String.format()等方法可以为您进行舍入.它不仅会切断精度,请参阅我的回答. (2认同)

San*_*kar 15

    Double toBeTruncated = new Double("2.25");

    Double truncatedDouble=new BigDecimal(toBeTruncated ).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
Run Code Online (Sandbox Code Playgroud)

它将返回2.3

  • 顺便说一句,您可能不希望变量名称中包含`truncated`,因为它具有与`round`不同的含义.`toBeRounded`和`roundedDouble`怎么样?我之所以提到这一点,是因为我第一次想到你的回答是"为什么他要截断,要求四舍五入?" (4认同)

Mif*_*eet 11

如果您更频繁地需要此类操作,那么找到合适的库而不是自己实现它可能会更方便.

以下是使用Precision,使用函数的 Colt 和使用Utils的 Weka 从Apache Commons Math解决问题的单行:

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)
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)


小智 7

Double number = new Double("5.25");
Double tDouble = 
  new BigDecimal(number).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
Run Code Online (Sandbox Code Playgroud)

这将返回 5.3

  • 从 Java 9+ 开始,“BigDecimal.ROUND_HALF_UP”已被弃用。优先使用“RoundingMode.HALF_UP”。 (2认同)

Mic*_*irs 5

在我看来,一个简洁的替代方案更具可读性,但是,由于 double 和 String 之间的转换,可以说效率稍低:

double num = 540.512;
double sum = 1978.8;

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

如果你想要双倍的答案,你当然可以把它转换回来:

double ans = Double.parseDouble(str);
Run Code Online (Sandbox Code Playgroud)

  • 与 String 之间的转换比“一点点”效率低得多。如果问题确实是关于“显示为一位十进制数字”(可能不清楚),那么您就有了很好的答案。但如果这不是愿望,这不是一条好路。坚持对数字进行数字运算,除非想要的结果是一个字符串。 (3认同)

小智 5

你的方法是对的,你所要做的就是在两个十位后面添加一个.0,它就会解决你的问题!

double example = Math.round((187/35) * 10.0) / 10.0;
Run Code Online (Sandbox Code Playgroud)

输出将是:

5.3
Run Code Online (Sandbox Code Playgroud)