如何精确地将浮点数舍入到N个小数位[JAVA]

时间:2017-03-10 10:51:59

标签: java

我想要做的是将浮点数舍入到N个小数位的方法(N将在stdin中给出),用它做一些数学运算然后打印结果。我发现了这个:

   public BigDecimal round(float number, int decimal){
   BigDecimal obj = new BigDecimal(number).setScale(decimal, BigDecimal.ROUND_HALF_UP);
   return obj;

哪种方法效果很好,但是当数字N(此方法中的小数为十进制)很高时则不行。例如:x = -10,y = -11.8814,N = 8,它打印出来:

-10.00000000 + -11.88140011 = -21.88140106

这就是我想要的:

-10.00000000 + -11.88140000 = -21.88140000

感谢大家的建议:)

4 个答案:

答案 0 :(得分:2)

我认为最简单的方法是将你的数字乘以10 ^ N并使用round()将它们变成整数。运行数学,然后将它们分开

    public static void main(String[] args) {
        double a = -10.0;
        double b = -11.88140011;
        int n = 4;
        long total = round(a, n) + round(b, n);

        System.out.println(String.format("%.8f%n", total * Math.pow(10, -1*n)));
    }

    static Long round(double number, int decimal) {
        return Math.round(number * Math.pow(10, decimal));
    }

答案 1 :(得分:1)

没有float表示11.88140000并且所有8位小数都保持不变,所以当你将该数字传递给你的方法时,无论实现如何,它都没有机会返回想要的结果,请参阅{{3 }}:

  

...总精度为24位(相当于log10(224)≈71225十进制数字)

并且该精度包括所有数字,而不仅仅是小数分隔符之后的数字。

答案 2 :(得分:0)

你的问题已经有了答案,但为了更好地理解浮动与小数的问题,还有另一个post关于问题的深入解释(对每种编程语言都相同):

只是为了完整性:0.3将完全存储在BigDecimal中。在float中(由于它的二进制特性),它将存储为0.30000001192092896。使用float实例化BigDecimal并直接解决此问题。

答案 3 :(得分:0)

所以,这是答案。我没有使用 round 功能我只打印了带有结果的数字:

System.out.printf("%." + n + "f + %." + n + "f = %." + n + "f\n", a, b, a + b);

在我发布这个问题之前我尝试过,但是我使用了float并且尝试使用double(使用函数 nextDouble()进行扫描)。所以,双重就是答案。

感谢您的建议! :))