Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将双精度值截断为小数点后6位_Java_Math_Truncate - Fatal编程技术网

Java 将双精度值截断为小数点后6位

Java 将双精度值截断为小数点后6位,java,math,truncate,Java,Math,Truncate,我正在解决一个需要截断输出的问题,令我惊讶的是,我还没有找到在java中截断数字的方法 输出需要是数字后跟6位小数 我想要的是 双截双数,整数位,输出为 截断14/3.0=4.6666 但我得到的是 public static double round(double value, int places) { if (places < 0) throw new IllegalArgumentException(); long factor = (long) Math.pow

我正在解决一个需要截断输出的问题,令我惊讶的是,我还没有找到在java中截断数字的方法

输出需要是数字后跟6位小数

我想要的是 双截双数,整数位,输出为 截断14/3.0=4.6666

但我得到的是

public static double round(double value, int places) {
    if (places < 0) throw new IllegalArgumentException();

    long factor = (long) Math.pow(10, places);
    value = value * factor;
    long tmp = Math.round(value);
    return (double) tmp / factor;
  }
// rounds( 14/3.0 , 6 ) = 4.666667
我还尝试了在stackoverflow上找到的一个解决方案,该解决方案建议使用BigDecimal,并给出了完全相同的答案

NumberFormat似乎也以同样的方式工作

java.text.NumberFormat f = java.text.NumberFormat.getNumberInstance();
f.setMinimumFractionDigits(6);
System.out.println(f.format(14/3.0)); // 4.666667
是否有一个内置的方法可以做到这一点,或者我是否需要使用BigInteger之类的东西编写自己的方法?
有什么地方我做错了吗?

这是因为你不是在截断而是在舍入:

long tmp = Math.round(value);
如果改用强制转换,它应该可以工作:

long tmp = (long) value;
因此,下面的代码输出了您期望的4.666666:

public static void main(String[] args) throws Exception {
    System.out.println(truncate(14/3.0, 6));
}

public static double truncate(double value, int places) {
    if (places < 0) {
        throw new IllegalArgumentException();
    }

    long factor = (long) Math.pow(10, places);
    value = value * factor;
    long tmp = (long) value;
    return (double) tmp / factor;
}

这是因为您不是在截断,而是在舍入:

long tmp = Math.round(value);
如果改用强制转换,它应该可以工作:

long tmp = (long) value;
因此,下面的代码输出了您期望的4.666666:

public static void main(String[] args) throws Exception {
    System.out.println(truncate(14/3.0, 6));
}

public static double truncate(double value, int places) {
    if (places < 0) {
        throw new IllegalArgumentException();
    }

    long factor = (long) Math.pow(10, places);
    value = value * factor;
    long tmp = (long) value;
    return (double) tmp / factor;
}

double没有小数位数,因此不能截断为任何特定的位数。它们有两个位置。如果您需要特定的十进制表示,请使用DecimalFormat或BigDecimal。

double没有小数位数,因此您不能截断为任何特定的位数。它们有两个位置。如果需要特定的十进制表示,请使用DecimalFormat或BigDecimal。

以下代码帮助我限制双精度值的小数位数截断

public static Double truncate (double valueToTruncate, int numberOfDecimalPlaces) {

if (valueToTruncate > 0) {
    return new BigDecimal(String.valueOf(valueToTruncate)).setScale(numberOfDecimalPlaces, BigDecimal.ROUND_FLOOR).doubleValue();
} else {
    return new BigDecimal(String.valueOf(valueToTruncate)).setScale(numberOfDecimalPlaces, BigDecimal.ROUND_CEILING).doubleValue();
}
}


希望这对某人有所帮助:

以下代码帮助我限制双精度值的小数位数截断

public static Double truncate (double valueToTruncate, int numberOfDecimalPlaces) {

if (valueToTruncate > 0) {
    return new BigDecimal(String.valueOf(valueToTruncate)).setScale(numberOfDecimalPlaces, BigDecimal.ROUND_FLOOR).doubleValue();
} else {
    return new BigDecimal(String.valueOf(valueToTruncate)).setScale(numberOfDecimalPlaces, BigDecimal.ROUND_CEILING).doubleValue();
}
}


希望这对某人有所帮助:

我想要一个双倍值,铸造到长距离有什么帮助?@nikhil在你的round方法中,我建议进行替换,将该方法转换为你正在寻找的truncate方法。你也可以使用Math.floor。@starblue Yup,long factor=long Math.pow10,places;返回double Math.floorvalue*因子/因子;同样有效。我想要一个双倍值。铸造到长形有什么帮助?@nikhil在你的回合方法中,做我建议的替换会将该方法变成你正在寻找的截断方法。你也可以使用Math.floor。@starblue是的,long factor=long Math.pow10,places;返回double Math.floorvalue*因子/因子;也行。