所以我有一个简单的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时,它会正常工作。 但是,当我做+ + = 0.1时,它不会打印f。 有什么想法吗?
答案 0 :(得分:5)
你无法比较那样的花车。
通常用
之类的东西检查两个浮点数(双精度数)的相等性如果(Math.abs(i - bg)&lt; 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 :(得分:1)
浮点数没有您认为可能的所有数字的精确表示。例如,当将1除以3时,得到0.333 ...因为您使用十进制数字系统。
然而,计算机使用二进制,所以即使0.1看起来像一个简单而准确的数字,二进制它看起来更像0.0001100011 ......,依此类推到无穷大。并且,由于计算机没有无限的内存,因此该数字四舍五入到最接近的可能表示。这就是为什么精确的比较不起作用。
有很多方法可以解决这个问题。一种选择是使用已经提到的增量比较。但是,如果您知道您只处理小数点后最多数字的数字,则可以改为将所有数字乘以100使用整数。例如,如果您正在进行货币计算,这是建议的方式。
答案 2 :(得分:0)
在我的图形工具中,我将迭代一个整数值并动态计算浮点数:
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);
}
}