您所看到的是由于实数(读取浮点数)无法在二进制计算机中以完美的精度和准确度表示。这是生活中的事实。相反,计算机会近似该值并以定义的格式将其存储在内存中。
对于大多数现代机器(包括运行 MSVC Express 的任何机器),这种格式是IEEE 754。
长话短说,这就是 IEEE 754 中实数的存储方式:有一个符号位、8 个指数位和 23 个小数位(对于float
数据类型——doubles
相应地使用更多位,但格式相同)。因此,您永远无法达到完美的精度和准确性。幸运的是,您几乎可以为包括关键金融系统和科学系统在内的任何应用程序实现足够的准确性和精确度。
您无需了解有关 IEEE754 的所有信息即可在代码中使用浮点数。但是有几点你必须知道:
1)由于浮点计算和存储中固有的舍入误差,您永远无法比较 2 个浮点值是否相等。相反,您必须执行以下操作:
double d = 0.2;
double compare = 0.000000001;
double d2 = something;
if( (d - d2 < compare) && (d2 - d < compare) )
{
// numbers are equal
}
2) 舍入误差复合。对浮点值执行操作的次数越多,精度损失就越大。
3)您不能添加两个幅度差异很大的浮点数。例如,您不能添加 1.5x10^30 和 1.5x10^-30 并期望 60 位精度。