我想知道如何获得双倍的小数部分。 我尝试以下代码:
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”?
答案 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)));