有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从java原语double中删除小数点后的分数?

在Java中,我有:

double x = 0.800000000000002

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

我不想使用十进制格式,因为它将我的double转换为String

我想把x保留为双倍


共 (3) 个答案

  1. # 1 楼答案

    你当然知道,但遗憾的是0.8不能准确地表示为双精度

    如果需要任意精度,那么使用BigDecimal之类的类。(但在我看来,由于Java缺乏对运算符重载的支持,类是一头猪)

    adouble的一般规则是,它需要是一个适当大小的并矢有理数,才能完美地表示。例如,0.5、0.25和所有整数的53次方为2

  2. # 2 楼答案

    避免字符串格式设置的解决方案如下:

    1. 将双精度乘以10的幂,有效地将小数点向右移动到要截断的位置
    2. 使用所需的舍入方法对double值进行舍入,如Math.ceil()Math.floor()Math.rint()
    3. 将你的双精度除以你在第一步中乘以的10的幂

    例如,如果要将双精度四舍五入到小数点后两位:

    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的幂。并非所有的十进制值都可以用双精度表示,它们只是近似值

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

  3. # 3 楼答案

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

    根据你的便利程度使用。我想这会有帮助的