Java中的四舍五入错误

将许多无限实数压缩成有限位数需要近似表示。大多数程序最多存储32位或64位整数计算的结果。给定任何固定的位数,大多数实数计算将产生无法用那么多位精确表示的量。因此,浮点计算的结果必须经常进行四舍五入,以适应其有限表示形式。这种舍入误差是浮点计算的一个特征。

null

因此,在处理浮点数计算时(尤其是当计算是以金钱计算时),我们需要注意编程语言中的舍入错误。 我们来看一个例子:

public class Main {
public static void main(String[] args)
{
double a = 0.7 ;
double b = 0.9 ;
double x = a + 0.1 ;
double y = b - 0.1 ;
System.out.println( "x = " + x);
System.out.println( "y = " + y );
System.out.println(x == y);
}
}


输出:

x = 0.7999999999999999
y = 0.8
false

在这里,答案并不是我们所期望的,原因是java编译器完成了四舍五入。

舍入误差背后的原因

浮点和双精度数据类型实现IEEE浮点754规范。这意味着数字以如下形式表示:

SIGN FRACTION * 2 ^ EXP 

0.15625 = (0.00101) 2. ,以浮点格式表示为:1.01*2^-3 并非所有分数都可以精确地表示为二次幂的分数。举个简单的例子,0.1=(0.00011001…) 2. 因此不能存储在浮点变量中。

另一个例子:

public class Main {
public static void main(String[] args)
{
double a = 0.7 ;
double b = 0.9 ;
double x = a + 0.1 ;
double y = b - 0.1 ;
System.out.println( "x = " + x);
System.out.println( "y = " + y );
System.out.println(x == y);
}
}


输出:

x = 0.7999999999999999
y = 0.8
false

另一个例子:

public class Main {
public static void main(String args[])
{
double a = 1.0 ;
double b = 0.10 ;
double x = 9 * b;
a = a - (x);
// Value of a is expected as 0.1
System.out.println( "a = " + a);
}
}


输出:

a = 0.09999999999999998

如何纠正舍入错误?

  • 四舍五入结果: Round()函数可用于最小化浮点算术存储不准确的任何影响。用户可以将数字四舍五入到计算所需的小数位数。例如,在使用货币时,您可能会四舍五入到小数点后2位。
  • 算法和功能: 使用数值稳定的算法或设计自己的函数来处理此类情况。您可以截断/舍入不确定其正确性的数字(也可以计算运算的数值精度)
  • BigDecimal类: 你可以使用 JAVA数学大十进制 类,该类旨在为我们提供准确度,尤其是在大分数的情况下。

    以下程序显示了如何删除错误:

    public class Main {
    public static void main(String args[])
    {
    double a = 1.0 ;
    double b = 0.10 ;
    double x = 9 * b;
    a = a - (x);
    /* We use Math.round() function to round the answer to
    closest long, then we multiply and divide by 1.0 to
    to set the decimal places to 1 place (this can be done
    according to the requirements.*/
    System.out.println( "a = " + Math.round(a* 1.0 )/ 1.0 );
    }
    }

    
    

    输出:

    0.1

    现在我们得到了预期的输出,没有错误。 如果你喜欢Geeksforgek,并且想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。

    如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享