我没有合适的英语或数学词汇来真正解释我想做什么,但我会尽力解释。基本上我想弄清楚";"有多大";整数是指它有多少个小数位数。例如1234是";一千";2987123是"数字";一百万";数字
我可以做这样的事情,但那太傻了:(
extension Int {
func size() -> Int {
switch self {
case 0...99:
return 10
case 100...999:
return 100
case 1000...9999:
return 1000
case 10000...99999:
return 10000
case 100000...999999:
return 100000
case 1000000...9999999:
return 1000000
default:
return 0 // where do we stop?
}
}
}
使用对数的解决方案:
注意:由于
Double
无法完全表示转换为Double
的大型Int
的log10
,因此此解决方案具有局限性。它在15岁左右开始出现故障Int
的数字非常接近10的下一次幂(例如。999999999999999
(。这是一个问题:
log10(Double(999999999999999)) == log10(Double(1000000000000000))
extension Int {
var size: Int {
self == 0 ? 1 : Int(pow(10.0, floor(log10(abs(Double(self))))))
}
}
使用字符串的解决方案:
它通过完全使用Int
和String
来避免任何数学表示错误。
extension Int {
var size: Int {
Int("1" + repeatElement("0", count: String(self.magnitude).count - 1))!
}
}
任何FixedWidthInteger
:的通用版本
在与@LeoDabus的合作中,我为任何整数类型提供了通用版本:
extension FixedWidthInteger {
var size: Self {
Self("1" + repeatElement("0", count: String(self.magnitude).count - 1))!
}
}
示例:
Int8.max.size // 100
Int16.max.size // 10000
Int32.max.size // 1000000000
Int.max.size // 1000000000000000000
UInt.max.size // 10000000000000000000
我想到了这个:
extension Int {
func size() -> Int {
var size = 1
var modifyingNumber = self
while modifyingNumber > 10 {
modifyingNumber = modifyingNumber / 10
size = size * 10
}
return size
}
}
行得通,但这是非常必要的。
这太傻了吗?
extension Int {
var size : Int {
String(self).count
}
}
我的理由是;数字";实际上是的一种书写方式,因此转换为String可以回答真正的问题。将大小转换回数字(即10的相应幂(,当然会直接返回对数答案。:(