1

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

输出需要是一个数字,后跟 6 个小数位。

我想要的是 double truncate(double number,int places)和输出是 truncate(14/3.0) = 4.666666.

但我得到的是

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

随着String.format我得到

String.format("%.6f", 14/3.0) = 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 之类的方法编写自己的方法?有什么我做错了吗?

4

3 回答 3

5

这是因为您不是截断而是四舍五入:

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;
}
于 2012-12-06T17:42:27.407 回答
1

双打没有小数位,所以你不能截断到任何特定的数字。他们有二进制的地方。如果您需要特定的十进制表示,请使用DecimalFormatBigDecimal.

于 2012-12-07T00:50:25.460 回答
0

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

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

}

希望这可以帮助某人:)

于 2020-04-24T06:04:54.620 回答