c - 小于(<)float与c中if语句的比较

标签 c floating-point comparison

<分区>

案例一

float a = 0.6;

if (a < 0.6)
{
    printf("c");
}
else
{
    printf("c#");
}

输出c#

案例2

float a = 0.9;

if (a < 0.9)
{
    printf("c");
}
else
{
    printf("c#");
}

输出c

现在的问题是为什么?

最佳答案

我假设 float 是 IEEE 754 32 位二进制,double 是 IEEE 754 64 位二进制。

最接近 0.6 的 double 值,即文字的实际值,是 0.59999999999999997779553950749686919152736663818359375。将其转换为float的结果是0.60000002384185791015625,稍微大一点。

最接近 0.9 的双倍数是 0.90000000000000002220446049250313080847263336181640625。将其转换为float的结果是0.89999997615814208984375,稍微小一些。

在每种情况下,无法精确表示的小数部分将四舍五入到最接近的 double 以表示文字。它被舍入为一个 float 以分配给 a,根据舍入到最近的规则,它可能略小于或略大于 double ,或者如果 double 的二进制表示具有很多尾随零。

关于c - 小于(<)float与c中if语句的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24002057/

相关文章:

web-applications - 富 Web 应用技术列表

c - 不兼容的 C 指针加上结构采用的 seg 错误

c - 直接计算得到的最小正浮点值与<float.h>中的FLT_MIN不同

python - 字典不识别浮点键

Python:如果项目不是数字则追加到列表

java - 无效的 if 语句

node.js - 字符串比较失败

c++ - 使用 libxml2 编写 Base64 编码的文本节点

c - tun0 上带有 SIOCIFDESTROY v/s close(fd) 的 ioctl

c - 正常运行时程序无法运行,但逐步调试结果是正确的