如何获取小数点后的数字? (java)

double d = 4.321562; 

有没有一种简单的方法从d中提取0.321562? 我试着看数学课,但没有运气。 如果这可以在不转换为字符串或转换为其他任何内容的情况下完成,甚至更好。

好吧,你可以使用:

 double x = d - Math.floor(d); 

请注意,由于二进制浮点的工作方式,因为原始值不完全是4.321562,所以不会精确地给出0.321562。 如果你真的对确切的数字感兴趣,你应该使用BigDecimal

在不使用Math的情况下获得分数的另一种方法是强制转换为long。

 double x = d - (long) d; 

当您打印double精度时,toString将执行少量舍入,因此您不会看到任何舍入错误。 但是,当您删除整数部分时,舍入不再足够,并且舍入错误变得明显。

解决这个问题的方法是自己进行舍入或使用允许您控制舍入的BigDecimal。

 double d = 4.321562; System.out.println("Double value from toString " + d); System.out.println("Exact representation " + new BigDecimal(d)); double x = d - (long) d; System.out.println("Fraction from toString " + x); System.out.println("Exact value of fraction " + new BigDecimal(x)); System.out.printf("Rounded to 6 places %.6f%n", x); double x2 = Math.round(x * 1e9) / 1e9; System.out.println("After rounding to 9 places toString " + x2); System.out.println("After rounding to 9 places, exact value " + new BigDecimal(x2)); 

版画

 Double value from toString 4.321562 Exact representation 4.321562000000000125510268844664096832275390625 Fraction from toString 0.3215620000000001 Exact value of fraction 0.321562000000000125510268844664096832275390625 Rounded to 6 places 0.321562 After rounding to 9 places toString 0.321562 After rounding to 9 places, exact value 0.32156200000000001448796638214844278991222381591796875 

使用模数:

 double d = 3.123 % 1; assertEquals(0.123, d,0.000001);