问题描述
我没有正确的英语或数学词汇来真正解释我想要做什么,但我会尽力解释。基本上,我想弄清楚一个整数有多大,有多少个小数位。例如1234是“一千”数字,而2,987,123是“一百万”数字。
我可以做这样的事情,但这很愚蠢:)
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
无法完全表示转换为log10
的大型Int
的{{1}},因此该解决方案有局限性。它开始失败约15Double
的位数非常接近10的下一个幂(例如Int
。这是一个问题:
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))!
}
}
的通用版本:
我与@LeoDabus合作,为任何整数类型提供了 generic 版本:
FixedWidthInteger
示例:
extension FixedWidthInteger {
var size: Self {
Self("1" + repeatElement("0",count: String(self.magnitude).count - 1))!
}
}
,
我想到了这个
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的幂)将自然返回到对数答案。 :)