Orizz Asked:2020-10-01 21:54:26 +0000 UTC2020-10-01 21:54:26 +0000 UTC 2020-10-01 21:54:26 +0000 UTC C语言中如何判断两个实数是否相等? 772 目标是测试两个实数 (1.2和1.2) 的相等性。 提供的代码不起作用。 float a = 1.2; if (a == 1.2) { printf("Equals"); } c 2 个回答 Voted Harry 2020-10-01T22:00:37Z2020-10-01T22:00:37Z 您正在比较float和double,它们有不同的表示。 float a = 1.2; if (a == 1.2f) { printf("Equals"); } 这就是你比较两个的方式float。但请记住,如果计算1.2,则很可能不存在相等性,这仅仅是因为只有稀有数字被精确地表示为浮点类型。 最好设置比较的精度并检查类型是否相等 if (fabs(a-b) < eps) { // равны Best Answer HolyBlackCat 2020-10-03T00:32:45Z2020-10-03T00:32:45Z 详细说明: 1.2在二进制形式中,它在点之后有无限数量的字符:1.00110011...。 显然,无限数量的字符不适合内存,所以这个数字存储不准确(四舍五入)。 该double x = 1.2;号码存储 在1.0011001100110011001100110011001100110011001100110011. 十进制形式:1.1999999999999999555910790149937383830547332763671875. float x = 1.2;更少的字符适合:1.00110011001100110011010 十进制形式1.2000000476837158203125:. (使用 IEEE 754 标准时。) 当你这样做时: float a = 1.2; if (a == 1.2) 有一个比较float和double。为此,它float被转换为double. 事实证明,您正在比较 1.0011001100110011001100110011001100110011001100110011 == 1.19999999...和 1.0011001100110011001101000000000000000000000000000000 == 1.20000004...,这当然不相等。 正如@Harry 在相邻答案中已经写的那样,如果将比较替换为a == 1.2f,那么问题就消失了。 相反,如果1.2有一些其他数字可以在这两种类型中精确表示(例如1.25),那么您的代码将无需更改即可工作。
您正在比较
float和double,它们有不同的表示。这就是你比较两个的方式
float。但请记住,如果计算1.2,则很可能不存在相等性,这仅仅是因为只有稀有数字被精确地表示为浮点类型。最好设置比较的精度并检查类型是否相等
详细说明:
1.2在二进制形式中,它在点之后有无限数量的字符:1.00110011...。显然,无限数量的字符不适合内存,所以这个数字存储不准确(四舍五入)。
该
double x = 1.2;号码存储 在1.0011001100110011001100110011001100110011001100110011.十进制形式:
1.1999999999999999555910790149937383830547332763671875.float x = 1.2;更少的字符适合:1.00110011001100110011010十进制形式
1.2000000476837158203125:.(使用 IEEE 754 标准时。)
当你这样做时:
有一个比较
float和double。为此,它float被转换为double.事实证明,您正在比较
1.0011001100110011001100110011001100110011001100110011 == 1.19999999...和1.0011001100110011001101000000000000000000000000000000 == 1.20000004...,这当然不相等。正如@Harry 在相邻答案中已经写的那样,如果将比较替换为
a == 1.2f,那么问题就消失了。相反,如果
1.2有一些其他数字可以在这两种类型中精确表示(例如1.25),那么您的代码将无需更改即可工作。