是否有任何在java中截断double的函数?

时间:2009-12-29 20:35:39

标签: java

是否有Java库函数可用于将数字截断为任意数量的小数位? 例如。

SomeLibrary.truncate(1.575, 2) = 1.57

由于

11 个答案:

答案 0 :(得分:27)

尝试BigDecimal的setScale,如下所示:

public static double round(double d, int decimalPlace) {
    BigDecimal bd = new BigDecimal(d);
    bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
    return bd.doubleValue();
}

答案 1 :(得分:13)

令人难以置信的是,没有人提起这个问题,Java API现在已经有DecimalFormat用于此目的。

答案 2 :(得分:6)

对于大多数数字,除非使用保证准确性的十进制类,否则您将无法获得xxx.yyyy的精确表示。

答案 3 :(得分:5)

在公共数学中有一个。查看 http://commons.apache.org/math/apidocs/org/apache/commons/math/util/MathUtils.html

public static double round(double x,
                           int scale)

它是使用BigDecimal实现的,并且重载以允许指定舍入方法,因此您可以使用它来截断,如下所示:

org.apache.commons.math.util.MathUtils.round(1.575, 2, 
    java.math.BigDecimal.ROUND_DOWN);

<强>更新

在上一个版本(Math3)中,此方法位于类Precision中。 org.apache.commons.math3.util.Precision.round(double x, int scale, int roundingMethod)

答案 4 :(得分:2)

这是一个简短的实现,比使用BigDecimal或Math.pow

快许多倍
private static long TENS[] = new long[19];
static {
    TENS[0] = 1;
    for (int i = 1; i < TENS.length; i++) TENS[i] = 10 * TENS[i - 1];
}

public static double round(double v, int precision) {
    assert precision >= 0 && precision < TENS.length;
    double unscaled = v * TENS[precision];
    if(unscaled < Long.MIN_VALUE || unscaled > Long.MAX_VALUE) 
       return v;
    long unscaledLong = (long) (unscaled + (v < 0 ? -0.5 : 0.5));
    return (double) unscaledLong / TENS[precision];
}

删除品味的断言。 ;)

答案 5 :(得分:2)

使用这个简单的功能

double truncateDouble(double number, int numDigits) {
    double result = number;
    String arg = "" + number;
    int idx = arg.indexOf('.');
    if (idx!=-1) {
        if (arg.length() > idx+numDigits) {
            arg = arg.substring(0,idx+numDigits+1);
            result  = Double.parseDouble(arg);
        }
    }
    return result ;
}

答案 6 :(得分:2)

我只想添加到ubuntudroid的解决方案中。 我尝试了它,它不会向下舍入,所以我不得不添加

df.setRoundingMode(RoundingMode.FLOOR);

让它发挥作用。

答案 7 :(得分:2)

只需删除小数部分

public double trunk(double value){ return value - value % 1; }

答案 8 :(得分:0)

要100%可靠地执行此操作,您必须将参数作为字符串传递,而不是作为浮点数传递。当以字符串形式给出时,代码很容易编写。原因是

double x = 1.1;

并不意味着x实际上会评估为1.1,而只是最接近的可精确表示的数字。

答案 9 :(得分:0)

实际上,这类事情很容易写出来:

public static double truncate(double value, int places) {
    double multiplier = Math.pow(10, places);
    return Math.floor(multiplier * value) / multiplier;
}

请注意,它是Math.floor,因为Math.round不会截断。

哦,这会返回一个double,因为这就是Math类中大多数函数返回的内容(如Math.pow和Math.floor)。

警告:双打很难准确。首先应考虑BigDecimal解决方案之一。

答案 10 :(得分:-1)

创建了一种方法来实现它。

public double roundDouble(double d, int places) {
    return Math.round(d * Math.pow(10, (double) places)) / Math.pow(10, (double)places);
}