使用swift检查数字是否为十进制

Mon*_*WTF 11 ios swift

如何使用swift检查数字是否为小数?

使用Objective-C:

if (number == (int) number) {
  //decimal
}
else {
  //not decimal
}
Run Code Online (Sandbox Code Playgroud)

Jes*_*ssy 52

extension FloatingPoint {
  var isInteger: Bool { rounded() == self }
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是正确的答案!只需停止使用0.00000XX即可 (6认同)
  • @Jessy 不过,从数学角度来说,`(0.1 + 0.2) * 10` _确实_ 等于`3`;它在计算中不起作用的原因只是由于浮点数学的不精确性。在几乎所有实际情况下,数学结果都是用户想要的,而 FP 特性只是实现细节。大多数时候,为了满足用户的期望,最好弄清楚您的用例需要什么精度,并相应地比较您的浮动。 (2认同)

小智 7

迅速:

if number.rounded(.up) == number.rounded(.down){
    //number is integer
}else{
    //number is not integer
}
Run Code Online (Sandbox Code Playgroud)


max*_*ax_ 6

如果你将数字向下舍入(你可以使用floor功能),然后从原始数字中减去它,你将得到两者之间的差异.

if (number - floor(number) > 0.000001) { // 0.000001 can be changed depending on the level of precision you need
    // decimal
}
Run Code Online (Sandbox Code Playgroud)

编辑 -

我原来的答案建议计算数字和它的平均等价之间的差异,看看小数点后面是否有任何单位.然而,如稍后所述,可能存在舍入误差,其导致存储器中的值的表示与其实际意图的略微不同.

例如,3.0可以表示为3.00000000000001,因此number - floor(number) > 0它将返回true,即使它理论上应该返回false,因为偏移量将是0.00000000000001.

因此,请使用@ jessy的答案.

  • @max_因为有了浮点数学,你有时会得到像3.000000001或2.999999999999这样的值而不是整数.您使用的值而不是0取决于您想要计算为整数的整数的接近程度..001足够接近吗?是.000000001? (2认同)