首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Int(圆形(X))安全吗?

使用Int(圆形(X))安全吗?
EN

Stack Overflow用户
提问于 2017-05-11 07:03:43
回答 1查看 159关注 0票数 0

假设你有一个双值,想把它舍入一个整数.

许多循环()函数返回一个双(而不是一个整数):

(这很可能是因为双倍的可能值范围更广。。)

考虑到这种“默认”行为,这可能解释了为什么您通常会看到以下建议:

代码语言:javascript
复制
Int(round(myDouble))

(这里我们假设Int() 删除十进制后的所有内容。:4.9 -> 4。)

到目前为止还不错,直到你意识到多么复杂的漂浮 要点真的是。例如,55实际上可能以54.9999999999999999的形式存储。

因此,听起来可能会发生以下情况:

代码语言:javascript
复制
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

  1. 如果我们使用Int(round(x)),这样的事情真的会发生吗?
  2. 如果是这样的话,我们应该用什么代替Int(round())
  3. 关联:许多语言定义了floor(double) -> doubleInt(floor(double))安全吗?
EN

回答 1

Stack Overflow用户

发布于 2017-05-11 09:47:23

浮点模型是在以下基础上建立的:

  • 碱基b
  • 基数有限的意义(p表示精度)
  • 用于移动浮点的指数e,也限制在一定范围内。
  • 标志

因此浮点值如下所示:(-1)^signBit * significand * b^e

意义可以用一个规范化形式x.xxxxxxxx表示,浮点左1位(除零外,或最终值接近于零,失去精度并逐渐下降)和浮点后的p-1数字。

但是通过适当地移动指数(e+1-p),它也可以被认为是一个带有p位数xxxxxxxxx.0的整数。

在指数的合理范围内,我们发现到b^p为止的每一个整数都可以用这样的浮点模型精确地表示。在精度有限的情况下,基b中的最后一个数字会丢失,因此,如果整数太大而不能适应意义,那么它必然会有一个空分数部分。因此,除了一个积分值(带空分数部分)外,没有理由返回其他任何内容。

正如您注意到的,唯一不安全的部分是,Int范围可能比浮点值的范围小得多。因此,将大型浮点转换为Int可能导致溢出异常,或者更糟的是,具有未定义行为的无声溢出.

因此,为了消除分数部分,向Int转换是不必要的。它必须用于其他目的(例如,为程序的另一部分提供只接受Int的部分)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43908643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档