float失效的情况

前言:在最近的笔试中,两次碰到类似的问题,什么情况下float会失效?我目前知道的有2种:

1)display:none;

2)position:absolute、fixed。

(1)display:none

设置成display:none了之后,float失效这一点自然不用说。因为此时元素已经不在dom树里了,float当然起不了作用。

(2)position:absolute、fixed。

先看看没有设置position:absolute/fixed时的表现:

<div id="wrap">
    <div id="div1">浮动div</div>
    <div id="div2">参考div</div>
</div>
#wrap{
     width:300px;
     height:300px;
     border:1px solid black;
     position: relative;
     margin: 0 auto;
 }
 #div1{
     width:100px;
     height:100px;
     background: red;
     float:left;

 }
 #div2{
     width:100px;
     height:100px;
     background:blue;
     float:left;
 }

image

现在,为红色div1设置position:absolute/fixed:

#div1{
     width:100px;
     height:100px;
     background: red;
     float:left;
     position: fixed;
     /*或者position: absolute;*/
     top:20px;
     left:20px;
 }

image                      image

               position:absolute                                                         position:fixed

以上两种,无论是fixed(相对窗口定位)或者absolute(相对最近的position属性不为static的祖先元素),都使得红色div的float失效,于是蓝色div直接浮动到边界的左上角。

转载于:https://www.cnblogs.com/youhong/p/6663536.html

<think>好的,我现在要帮助用户了解如何安全地比较两个浮点数。首先,我需要回忆一下关于浮点数比较的基本知识。根据用户提供的引用内容,特别是引用[2]和引用[4],浮点数的精度问题是因为它们在计算机中的表示方式导致的。比如,0.1在二进制中无法精确表示,所以存储时会存在微小的误差。因此直接用“==”比较可能会出错。 用户的问题集中在如何正确比较两个float值,所以需要列出几种常见的方法。首先想到的是绝对误差法,即比较两个数的差值是否在一个很小的阈值内。比如引用[2]中提到的使用绝对值判断差值是否在允许的精度范围内。例如,如果两个数的差小于1e-6,就认为它们相等。 接下来是相对误差法,这在数值较大时可能更有效,因为绝对误差可能不够。相对误差考虑的是差值相对于数值大小的比例,适用于数值范围较大的情况。例如,当两个数本身的绝对值较大时,使用相对误差可以避免因为数值大而设置的绝对阈值不够灵敏的问题。 然后是结合绝对和相对误差的方法,这种方法可以兼顾不同情况。比如先检查绝对误差,如果其中一个数接近零,可能用绝对误差更合适,否则使用相对误差。这需要根据具体情况调整。 另外,引用[1]中提到避免直接比较浮点数,可以通过四舍五入到特定小数位后再比较。例如,将数值乘以100,取整后再除以100,这样可以保留两位小数,减少精度问题的影响。不过这种方法可能会损失一些精度,但适用于对精度要求不高的场景。 还需要考虑特殊值的处理,比如NaN和无穷大。在比较时,需要先检查这些情况,因为直接比较NaN会导致结果总是假,必须使用isnan()函数来判断。此外,正负零在IEEE标准中是不同的,但有时可能需要将它们视为相等,这需要根据需求决定。 最后,用户可能想知道实际应用中的最佳实践。比如在编程中应该使用哪些函数或库,比如Python中的math.isclose()或者C++中的epsilon方法。同时,需要提醒用户避免链式比较,因为误差可能累积,导致意外结果。 总结一下,回答的结构应该是先解释为什么不能直接比较,然后分点列出各种方法,每种方法的适用场景,并给出代码示例。同时引用提供的参考资料来支持观点,比如引用[2]和[4]中的内容。最后生成相关问题,帮助用户进一步学习。</think>### 如何安全地比较浮点数? 浮点数在计算机中通过尾数和指数的组合表示实数,但受限于存储精度(如单精度`float`为32位,双精度`double`为64位),某些十进制小数无法精确表示(如$0.1$的二进制表示是无限循环小数),导致直接比较可能出错[^4]。以下是安全比较浮点数的方法: --- #### 1. **绝对误差法** 比较两个浮点数的**绝对差值**是否小于一个极小阈值$\epsilon$(例如$1 \times 10^{-6}$): $$|a - b| < \epsilon$$ - **适用场景**:数值范围已知且较小时。 - **代码示例(Python)**: ```python def is_equal_abs(a, b, epsilon=1e-6): return abs(a - b) < epsilon ``` --- #### 2. **相对误差法** 当数值范围较大时,使用**相对误差**来适应不同数量级的数值: $$\frac{|a - b|}{\max(|a|, |b|)} < \epsilon$$ - **适用场景**:数值范围差异较大,避免绝对误差失效- **代码示例(Python)**: ```python def is_equal_rel(a, b, epsilon=1e-6): if a == 0 and b == 0: return True return abs(a - b) / max(abs(a), abs(b)) < epsilon ``` --- #### 3. **结合绝对和相对误差** 综合两种方法,避免数值接近零时相对误差不稳定的问题: $$|a - b| < \epsilon_{\text{abs}} \quad \text{或} \quad \frac{|a - b|}{\max(|a|, |b|)} < \epsilon_{\text{rel}}$$ - **代码示例(Python)**: ```python def is_equal_combined(a, b, abs_eps=1e-6, rel_eps=1e-6): diff = abs(a - b) if diff < abs_eps: return True return diff / max(abs(a), abs(b)) < rel_eps ``` --- #### 4. **四舍五入后比较** 通过限制精度减少误差影响(如保留两位小数)[^1]: ```python rounded_a = round(a * 100) / 100 rounded_b = round(b * 100) / 100 return rounded_a == rounded_b ``` --- #### 5. **特殊值的处理** - **NaN(非数字)**:使用`math.isnan()`判断。 - **无穷大**:直接比较符号。 - **正负零**:IEEE标准中$+0$和$-0$可能不同,需根据需求处理。 --- ### 最佳实践 🚀 1. **避免直接使用`==`或`!=`**:如引用[2]所述,浮点数的精度误差可能导致意外结果。 2. **优先使用语言内置函数**:如Python的`math.isclose(a, b, rel_tol=1e-9, abs_tol=0.0)`。 3. **明确精度需求**:根据场景选择$\epsilon$,例如物理仿真常用$1 \times 10^{-6}$,图形学可能放宽到$1 \times 10^{-3}$。 4. **避免链式比较**:如`a < b < c`可能因误差累积失效,应拆分为两步。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值