假设你有一个双重价值,并希望将其四舍五入到整数...使用Int(round(x))是否安全?
许多轮()函数返回的不是整数双:
- C# - 圆(双) - >双
- C++ - 轮(双) - >双
- Darwin - 轮(双) - >双
- Swift - double.rounded() - >双
- Java - 圆(双) - > INT
- Ruby:float.round() - > INT
鉴于这种 “默认” 的行为(这是因为doubles have a much wider range of possible values是最有可能的),这也许就是为什么你会看到常用以下建议:
Int(round(myDouble))
(这里我们假设Int()
removes everything after the decimal:4.9 - > 4)
到目前为止好,直到你意识到how complex floatingpoints really are。例如。例如,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))
安全吗?
该舍入值(循环函数的结果)的假设可具有非零分数部分不对应于现实。我不知道这种奇特的浮点模型是否曾经存在过,但如果是这样的话,它肯定会死掉。如果它不在模型中,它也不在库中:不轮回的循环函数是一个错误,而不是一个功能。 –
所以你不想转换为Int去除小数,round()已经为你做了。要转换为Int,因为在代码中的一些功能的进一步不支持多态类型,如果你这样做,你就不得不面对有限的诠释范围 - 这是不安全的部分。如果语言支持无限整数,则整数结果可能已经是整数。 –