【发布时间】:2017-04-08 02:19:38
【问题描述】:
我有一个数字(64 位整数),想知道它是否是 10 的纯幂。也就是说,1 后跟 0 或多个零。 有没有一种不涉及将其转换为字符串的有效方法?
目前我正在这样做:
科特林
fun isPowerOf10(n: Long): Boolean {
val logN = Math.log10(myInt.toDouble())
return logN != Math.floor(logN)
}
Java
static boolean isPowerOf10(long n) {
double logN = Math.log10((double) myInt);
return logN != Math.floor(logN);
}
但由于在转换为双精度并采用 log10 时精度损失,isPowerOf10(999_999_999_999_999_999)(和负数版本)会失败,它会精确输出 18.0。
【问题讨论】:
-
考虑到案例很少,一个简单的
switch可能是合理的。 -
或者类似地简单地创建一个循环来预填充
HashSet<Long>。无论您做什么,都不要使用双精度/对数逻辑进行纯整数检查,否则您将受到浮点精度的摆布,就像您在 999_999_...中看到的那样...... -
您是否尝试过使用 BigDecimal 类型,我不知道是否有它的数学库,但它的精度比 Double 类型更好。
-
@jonhkr 我认为
BigDecimal在这种情况下与String足够接近以避免它〜:P
标签: java math kotlin logarithm