从java原始double中删除小数位的分数?

时间:2016-02-10 16:38:31

标签: java

在Java中我有:

double x = 0.800000000000002

我想删除00000000000002格式x,我希望x值为0.8。

我不想使用小数格式,因为它将我的double转换为String。

我想将x保持为双倍。

3 个答案:

答案 0 :(得分:1)

当然可以,但遗憾的是0.8 不能完全表示为双倍。

如果您想要任意精度,请使用类似BigDecimal的类。 (但在我看来,由于Java缺乏对运算符重载的支持,类是一只猪使用。)

double的一般规则是,它必须是一个适当大小的二元有理才能完美呈现。例如,0.5,0.25和所有整数,最大值为53的幂。

答案 1 :(得分:1)

double number =0.76432;
  double value =Double.parseDouble(new DecimalFormat("##.##").format(number));
  System.out.println(value);

根据您的使用情况使用。我想这会有所帮助。

答案 2 :(得分:1)

避免字符串格式化的解决方案是:

  1. 将你的双倍乘以10的幂,有效地将小数位移到你想要截断的位置的右​​边。
  2. 使用所需的舍入方法舍入double值,例如Math.ceil()Math.floor()Math.rint()
  3. 将你的双倍除以你在步骤1中乘以10的相同幂。
  4. 例如,如果要将双精度数转换为两位小数:

    double x = 0.800000000000002;
    System.out.println(x); // 0.800000000000002
    x = Math.rint(x * 100) / 100;
    System.out.println(x); // 0.8
    

    该概念也可用于四舍五入和类似的舍入,可用于故障计算的研究。

    你可以将它放在一个库中,如下所示:

    public enum Round {;
        public static double round(final double x, final int decimalPrecision) {
            round(x, decimalPrecision, Math::rint);
        }
        public static double roundUp(final double x, final int decimalPrecision) {
            round(x, decimalPrecision, Math::ceil);
        }
        public static double roundDown(final double x, final int decimalPrecision) {
            round(x, decimalPrecision, Math::floor);
        }
        public static double round(final double x, final int decimalPrecision, final Function<Double, Double> round) {
            return round.apply(x * decimalPrecision) / decimalPrecision);
        }
    }
    

    注意:请记住,双精度数基于2的幂。并非所有十进制值都可以用双精度表示,它们只是近似值。

    警告:我尚未测试上述代码。