在C中,如果我们执行以下代码:
float a = 0.7;
if (a < 0.7)
{
printf("Less");
}
else
{
printf("no");
}
上面的代码打印“更少”。
但如果我们执行以下代码:
float a = 1.7;
if (a < 1.7)
{
printf("Less");
}
else
{
printf("no");
}
它打印“否”。
原因是什么?浮点数据类型是如何工作的?
浮点数数据类型使用近似值。C/C中的每个数字数据类型都使用有限的、固定数量的字节来存储值。浮动
以指数格式存储值,这样如果您以另一种格式向其传递值,则该值将被舍入...然后,如果您查看超过小数分隔符的足够多的数字,您肯定会看到非零值。正如彼得·亚历山大在他的回答中所说,1.7不是一个“纯粹的”浮动值。
对这样一个设计背后的动机的进一步详细解释可能对这里的一个读者来说太长了——但是如果你在谷歌上搜索,你可能会读到更多。其中一位评论者Luchian在那里留下了一个很好的链接:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
问题是a
是一个float
,但是0.7
是一个双
。分配给a
的值从double
转换为float
,这将失去精度。当您将a
与double
进行比较时,a
被加宽为double
,但精度已经丢失,并且它们可能不再相等。
如果您将0.7
和1.7
更改为0.7f
和1.7f
,那么它们将被转换为浮动
文字,并且在这两种情况下都将可靠地与a
进行比较。
问题内容: 我刚刚阅读了有关浮点值比较的声明 不得使用==或!=运算符比较浮点值。大多数浮点值没有精确的二进制表示形式,并且精度有限。 如果是这样,比较两个浮点值的最佳方法是什么? 问题答案: 以下扩展方法对于实现Kevin的建议可能有用: 现在,您可以执行以下操作: 只需将更改为更合适的名称,或在需要时将默认边距更改为比更好的值。
对于这些代码行,我得到0作为输出,即它们都是相等的。现在,如果我理解正确,a b和c可能会存储稍微不同版本的真值.3因此,当做一个Float.compare(...)对这些值,我希望得到一个输出值,而不是0。为什么我把它们取为0?
我知道使用是因为分辨率无关的坐标系。 与,,,,比较时不是容易出现误报吗?它是一个浮点,它们有不精确的问题:例如。 在比较时是否在内部处理这个问题,或者是否会发生读取为零的与不比较为true的情况?
问题内容: 我在MySQL数据库架构中引入浮点列时遇到了一个问题,即对浮点值的比较不会总是返回正确的结果。 1-50.12 2-34.57 3-12.75 4-…(其余均小于12.00) 这将返回“ 3”。 我已经读过,在MySQL中比较浮点值是一个坏主意,十进制类型是更好的选择。 我是否有希望继续使用float类型,并使比较正常工作? 问题答案: 您是否注意到以下问题? 在某些行之间有一个额外的
我正在计算一个形式为的实数值。例如,,然后和接下来,我需要检查是否大于或等于比值。 在C/C++中,下面的语句似乎给出了正确的结果;不过,我不确定是否是正确的对比方式: 我也试着做另一种方式,但它似乎给出了不正确的结果。
问题内容: 我想比较PHP中的两个浮点数,如以下示例代码所示: 在此代码中,即使和相同,它也返回条件的结果而不是条件。有没有什么特殊的方法来处理/比较PHP中的浮点数? 如果是,那么请帮助我解决此问题。 还是我的服务器配置有问题? 问题答案: 如果您这样做,它们 应该 是相同的。但是请注意,浮点值的一个特征是 看起来 可以导致相同值的计算实际上不必相同。因此,如果是一个文字并通过计算到达该文字,则