[英]Print on last iteration of for loop
所以我有一个简单的for循环:
double bg = 5.0;
double f = 0.0;
for(double i = 0; i <= bg; i += 1)
{
f = f + ((2 * i + 1)*0.1);
if(i == bg)
{
System.out.printf ("%.1f" , f);
}
}
当我为每个实例将i递增1时,它可以正常工作。 但是当我做我+ = 0.1时它不会打印f。 有什么想法吗?
您不能像这样比较浮点数。
通常,两个浮点数(双精度)的相等性用类似以下方法检查
如果(Math.abs(i-bg)<0.00001f)//0.00001f是非常小的值-几乎为零,请选择此值以满足您的需要
有关更多信息,请访问http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
您的代码应如下所示
double bg = 5.0;
double f = 0.0;
for(double i = 0; i <= bg; i += 1)
{
f = f + ((2 * i + 1)*0.1);
if (Math.abs(i - bg) < 0.00001f)
{
System.out.printf ("%.1f" , f);
}
}
浮点数并未完全代表您认为可能存在的所有数字。 例如,将1除以3时,将得到0.333 ...,因为您使用的是十进制数字系统。
但是,计算机使用二进制,因此即使0.1看起来是一个简单而准确的数字,但二进制看起来更像0.0001100011 ...,依此类推,直到无穷大。 而且,由于计算机没有无限的内存,因此此数字四舍五入为最接近的可能表示形式。 这就是为什么精确比较不起作用的原因。
有很多方法可以解决此问题。 一种选择是使用已经提到的增量比较。 但是,如果您知道只处理小数点后的数字,则可以用整数代替100。 例如,如果您要进行货币计算,这是建议的方法。
在我的图形工具中,我将遍历一个整数值并即时计算浮点数:
int bg = 5;
double f = 0.0;
for(int i = 0; i <= bg; i += 1) {
f = f + ((2 * i + 1)*0.1);
if(i == bg)
{
System.out.printf ("%.1f" , f);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.