如何检查双倍的小数部分?

时间:2014-12-21 09:01:15

标签: java double

我想知道如何获得双倍的小数部分。 我尝试以下代码:

double auxValMin= Double.parseDouble("5.3");
double auxDecimal= auxValMin-floor(auxValMin);
System.out.println(auxDecimal); //I get 0.2999999999999998 instead of 0.3

我如何修复“0.2999999999999998”?

2 个答案:

答案 0 :(得分:1)

double具有更高的精确度float,但仍有舍入误差。你必须得到任何答案才能获得理智的输出。

如果这不是你想要的,你可以使用没有舍入错误的BigDecimal,但有其自己的头痛恕我直言。

默认的Float.toString()使用最小的舍入,但通常不够。

System.out.println("With no rounding");
double n = 5.3d;
System.out.println("n= "+new BigDecimal(n));
double expected = 0.3d;
System.out.println("expected= "+new BigDecimal(expected));

System.out.println("n % 1= "+new BigDecimal(n % 1));
System.out.println("n - Math.floor(n) = "+new BigDecimal(n - Math.floor(n)));
System.out.println("n - (int)n= "+new BigDecimal(n - (int)n));

System.out.println("With rounding");
System.out.printf("n %% 1= %.2f%n", n % 1);
System.out.printf("n - Math.floor(n) = %.2f%n", n - Math.floor(n));
System.out.printf("n - (int)n= %.2f%n", n - (int)n);

打印

With no rounding
n= 5.29999999999999982236431605997495353221893310546875
expected= 0.299999999999999988897769753748434595763683319091796875
n % 1= 0.29999999999999982236431605997495353221893310546875
n - Math.floor(n) = 0.29999999999999982236431605997495353221893310546875
n - (int)n= 0.29999999999999982236431605997495353221893310546875 
With rounding
n % 1= 0.30
n - Math.floor(n) = 0.30
n - (int)n= 0.30

一些谷歌搜索可能有所帮助:https://stackoverflow.com/a/5017110/820410

答案 1 :(得分:1)

现在有一天BigDecimal你会得到Java.Please阅读并了解BigDecimal

 BigDecimal value=new BigDecimal("5.36777777");
    System.out.println( value.round(new MathContext(2, RoundingMode.CEILING)));