如何在Java中不舍入地截断十进制数?

如何在Java中不舍入地截断十进制数?,java,Java,我有一系列Java小数,如: 0.43678436287643872 0.4323424556455654 0.6575643254344554 我想删去小数点后5位的所有内容。这怎么可能 float f = 0.43678436287643872; BigDecimal fd = new BigDecimal(f); BigDecimal cutted = fd.setScale(5, RoundingMode.DOWN); f = cutted.floatValue(); 或 其中x包含

我有一系列Java小数,如:

0.43678436287643872
0.4323424556455654
0.6575643254344554
我想删去小数点后5位的所有内容。这怎么可能

float f = 0.43678436287643872;
BigDecimal fd = new BigDecimal(f);
BigDecimal cutted = fd.setScale(5, RoundingMode.DOWN);
f = cutted.floatValue();

其中
x
包含您想要剪切的值,例如
0.43678436287643872

我相信该类是您所需要的。

在这里也可以提供帮助:

    double d = 0.436789436287643872;
    DecimalFormat df = new DecimalFormat("0.#####");
    df.setRoundingMode(RoundingMode.DOWN);

    double outputNum = Double.valueOf(df.format(d));
    String outpoutString = df.format(d);

我会使用如下正则表达式:

    double[] values = { 
            0.43678436287643872,
            0.4323424556455654,
            0.6575643254344554,
            -0.43678436287643872,
            -0.4323424556455654,
            -0.6575643254344554
    };

    Pattern p = Pattern.compile("^(-?[0-9]+[\\.\\,][0-9]{1,5})?[0-9]*$");
    for(double number : values) {
        Matcher m = p.matcher(String.valueOf(number));
        boolean matchFound = m.find();
        if (matchFound) {
            System.out.println(Double.valueOf(m.group(1)));
        }
    }

如果您需要支持更多/更少的小数位数,则可以轻松修改该模式。

如果您希望保持快速和简单。;)

印刷品

0.43678436287643874 => 0.43678
0.4323424556455654 => 0.43234
0.6575643254344554 => 0.65756
-0.43678436287643874 => -0.43678
-0.4323424556455654 => -0.43234
-0.6575643254344554 => -0.65756
-0.6575699999999999 => -0.65756

要概括Peter的答案,您可以:

public static double round(double n, int decimals) {
    return Math.floor(n * Math.pow(10, decimals)) / Math.pow(10, decimals);
}


这不是小数点后的最后一位吗?OP希望避免这种情况。HALF_UP不会直接将其切断:你可能实际上是指
FLOOR
。是的,唯一的问题是取整模式/不必要会导致错误,因此必须选择取整。任何人只要注意一下,将浮点值转换为字符串,然后用该字符串构造BigDecimal。从技术上讲,否:去掉小数点后几位的行为是舍入,只是你总是舍入到小数点后5位。请参阅下面的答案以了解您的选项。您希望结果是字符串还是数字?我希望结果是数字number@Piskvor:我错了。我没有数“0”。已编辑。@HarryJoy:感谢您的建议警告:仅当输入值在-10和10之间时才有效。我想说,如果您有neagative值,则为0-8,否则为0-7@皮斯科沃尔:我不明白你的意思
10.123456789
变成
10.1234
。这可能是最好的解决方案!我只是想在接受它之前找出它的任何问题!那么-0.657569会产生-0.65756吗?在第一种情况下,您的值必须小于10万亿才能避免溢出,在第二种情况下,您不必担心。@PeterLawrey我真的不理解“比创建对象稍微慢一点,但比创建对象快一点”这句话,“任何对象是如何使用(长)(d*1e5)/1e5创建的?”或者有一些我看不到的自动包装魔法(@vach上次我测试
数学时,floor(x)
比cast
(long)x
稍微慢一点,但那至少是5年前的事了。我想如果你今天尝试JMH,它可能不会明显慢一点。
public static void main(String... args) {
    double[] values = {0.43678436287643872, 0.4323424556455654, 0.6575643254344554,
            -0.43678436287643872, -0.4323424556455654, -0.6575643254344554,
            -0.6575699999999999 };

    for (double v : values) 
        System.out.println(v + " => "+roundDown5(v));
}

public static double roundDown5(double d) {
    return ((long)(d * 1e5)) / 1e5;
    //Long typecast will remove the decimals
}

// Or this. Slightly slower, but faster than creating objects. ;)
public static double roundDown5(double d) {
    return Math.floor(d * 1e5) / 1e5;
}
0.43678436287643874 => 0.43678
0.4323424556455654 => 0.43234
0.6575643254344554 => 0.65756
-0.43678436287643874 => -0.43678
-0.4323424556455654 => -0.43234
-0.6575643254344554 => -0.65756
-0.6575699999999999 => -0.65756
public static double round(double n, int decimals) {
    return Math.floor(n * Math.pow(10, decimals)) / Math.pow(10, decimals);
}