【问题标题】:truncate double value to 6 decimal places将双精度值截断到小数点后 6 位
【发布时间】:2012-12-06 17:41:10
【问题描述】:

我正在解决一个需要截断输出的问题,令我惊讶的是,我无法找到在 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 之类的方法编写自己的方法? 是不是我做错了什么?

【问题讨论】:

    标签: java math truncate


    【解决方案1】:

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

    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 值,转换为 long 有什么帮助?
    • @nikhil 在你的round 方法中,做我建议的替换将方法变成你正在寻找的truncate 方法。
    • 你也可以使用Math.floor
    • @starblue 是的,long factor = (long) Math.pow(10, places); return (double) Math.floor(value * factor) / factor; 也可以。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      }

      希望这可以帮助某人:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多