浮点数的小数部分

浮点数的小数部分

我需要提取浮点数的小数部分,但得到了奇怪的结果:

float n = 22.65f;
// I want x = 0.65f, but...

x = n % 1; // x = 0.6499996

x = n - Math.floor(n); // x = 0.6499996185302734

x = n - (int)n; // x = 0.6499996

为什么会发生这种情况?为什么我得到这些值而不是 0.65

最佳答案

float 只有几位精度,因此您应该很容易看到舍入错误。尝试 double 这具有更高的准确性,但仍然存在舍入误差。你必须四舍五入你得到的任何答案才能有一个理智的输出。

如果这是不可取的,您可以使用 BigDecimal,它没有舍入错误,但恕我直言,它有自己的头疼问题。

编辑:你可能会觉得这很有趣。默认的 Float.toString() 使用最少的舍入,但通常还不够。

System.out.println("With no rounding");
float n = 22.65f;
System.out.println("n= "+new BigDecimal(n));
float expected = 0.65f;
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= 22.6499996185302734375
expected= 0.64999997615814208984375
n % 1= 0.6499996185302734375
n - Math.floor(n) = 0.6499996185302734375
n - (int)n= 0.6499996185302734375
With rounding
n % 1= 0.65
n - Math.floor(n) = 0.65
n - (int)n= 0.65

关于java - 如何获得浮点数的小数部分?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5017072/

10-14 20:21