将许多无限实数压缩成有限位数需要近似表示。大多数程序最多存储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