使用Math.round四舍五入到小数点后一位?

问题描述 投票:0回答:10

我有这两个变量

double num = 540.512
double sum = 1978.8

然后我做了这个表情

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

但我最终得到了 27.0。

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

java decimal rounding
10个回答
119
投票

我不久前创建的有用方法......

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

30
投票

试试这个

例如

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

输出:

55.54

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

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

它将返回2.3


24
投票

Math.round
方法返回一个
long
(如果传入
int
,则返回一个
float
),而Java的整数除法就是罪魁祸首。 将其转换回
double
,或者在除以
double
时使用
10
文字。 要么:

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

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

那么你应该得到

27.3

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


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); 

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

double ans = Double.parseDouble(str);

5
投票

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

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

输出将是:

5.3

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

0
投票

这是对 @jpydymond 答案的改进,因为它纠正了亚十进制“.xxxx5”的内部值实际上可以是“.xxxx499999...”的问题。 这可能会导致他的“round(123.335,2)”返回 123.33,而不是所需的 123.34。 该代码片段修复了这个问题,并且由于 64 位精度限制,还限制了小数点后 0...9 位的限制。

public static double round (double value, int decimalPlaces) {
    if(decimalPlaces < 0 || decimalPlaces > 9) {
        throw new IllegalArgumentException("The specified decimalPlaces must be between 0 and 9 (inclusive).");
    }
    int scale = (int) Math.pow(10, decimalPlaces);
    double scaledUp = value * scale;
    double dec = scaledUp % 1d;
    double fixedDec = Math.round(dec*10)/10.;
    double newValue = scaledUp+fixedDec;

    return (double) Math.round( newValue )/scale;
}

输出示例:

round(265.335,0)          = 266.0
round(265.335,2)          = 265.34
round(265.3335,3)         = 265.334
round(265.3333335,6)      = 265.333334
round(265.33333335,7)     = 265.3333334
round(265.333333335,8)    = 265.33333334
round(265.3333333335,9)   = 265.333333334
round(1265.3333333335,9)   = 1265.333333334
round(51265.3333333335,9)   = 51265.333333334
round(251265.3333333335,9)   = 251265.333333334
round(100251265.3333333335,9)   = 1.0025126533333333E8
round(0.1,0) = 0.0
round(0.1,5) = 0.1
round(0.1,7) = 0.1
round(0.1,9) = 0.1
round(16.45,1) = 16.5

我希望这对你有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.