假设你有一个双值,想把它舍入一个整数.
许多循环()函数返回一个双(而不是一个整数):
(这很可能是因为双倍的可能值范围更广。。)
考虑到这种“默认”行为,这可能解释了为什么您通常会看到以下建议:
Int(round(myDouble))(这里我们假设Int() 删除十进制后的所有内容。:4.9 -> 4。)
到目前为止还不错,直到你意识到多么复杂的漂浮 要点真的是。例如,55实际上可能以54.9999999999999999的形式存储。
因此,听起来可能会发生以下情况:
Int(round(55.4)) // we ask it to round 55.4, expecting 55
Int(54.9999999999999) // it rounded it to "55.0"
54 // the Int() function removed all remaining digits我们原以为55.4四舍五入为55,但最终评估结果为54。
Int(round(x)),这样的事情真的会发生吗?Int(round())floor(double) -> double。Int(floor(double))安全吗?发布于 2017-05-11 09:47:23
浮点模型是在以下基础上建立的:
bp表示精度)e,也限制在一定范围内。因此浮点值如下所示:(-1)^signBit * significand * b^e
意义可以用一个规范化形式x.xxxxxxxx表示,浮点左1位(除零外,或最终值接近于零,失去精度并逐渐下降)和浮点后的p-1数字。
但是通过适当地移动指数(e+1-p),它也可以被认为是一个带有p位数xxxxxxxxx.0的整数。
在指数的合理范围内,我们发现到b^p为止的每一个整数都可以用这样的浮点模型精确地表示。在精度有限的情况下,基b中的最后一个数字会丢失,因此,如果整数太大而不能适应意义,那么它必然会有一个空分数部分。因此,除了一个积分值(带空分数部分)外,没有理由返回其他任何内容。
正如您注意到的,唯一不安全的部分是,Int范围可能比浮点值的范围小得多。因此,将大型浮点转换为Int可能导致溢出异常,或者更糟的是,具有未定义行为的无声溢出.
因此,为了消除分数部分,向Int转换是不必要的。它必须用于其他目的(例如,为程序的另一部分提供只接受Int的部分)。
https://stackoverflow.com/questions/43908643
复制相似问题