java-为什么log(1000)/ log(10)与log10(1000)不同?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-为什么log(1000)/ log(10)与log10(1000)不同?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1693字,纯文字阅读大概需要3分钟。
内容图文
![java-为什么log(1000)/ log(10)与log10(1000)不同?](/upload/InfoBanner/zyjiaocheng/694/777dfaf5097b4642a7392724ada663be.jpg)
今天,我遇到了一个很奇怪的问题.我需要计算数字的字符串长度,所以我想出了这个解决方案
// say the number is 1000
(int)(log(1000)/log(10)) + 1
这是基于数学公式
log10x = lognx / logn10(解释为here)
但是我发现在C语言中
(int)(log(1000)/log(10)) + 1
不等于
(int) log10(1000) + 1
但应该如此.
我什至用这段代码在Java中尝试了同样的事情
(int) (Math.log(1000) / Math.log(10)) + 1
(int) Math.log10(1000) + 1
但它的行为方式相同.
故事还在继续.执行此代码后
for (int i = 10; i < 10000000; i *= 10) {
System.out.println(((int) (Math.log10(i)) + 1) +
" " + ((int) (Math.log(i) / Math.log(10)) + 1));
}
我懂了
2 2
3 3
4 3 // here second method produces wrong result for 1000
5 5
6 6
7 6 // here again
因此,该错误似乎发生在每1000个倍数上.
我向我的C老师展示了这一点,他说这可能是由于日志分割期间的某些类型转换错误引起的,但是他不知道为什么.
所以我的问题是
>(int)(Math.log(1000)/ Math.log(10))1为什么不等于(int)Math.log10(1000)1
,根据数学,它应该是.
>为什么仅1000的倍数会出错?
编辑:这不是舍入错误,因为
Math.floor(Math.log10(i)) + 1
Math.floor(Math.log(i) / Math.log(10)) + 1
产生相同的错误输出
2 2
3 3
4 3
5 5
6 6
7 6
edit2:我必须四舍五入,因为我想知道位数.
log10(999) + 1 = 3.9995654882259823
log10(1000) + 1 = 4.0
如果我只是四舍五入,我会得到相同的结果(4),这对于999是错误的,因为它有3位数字.
解决方法:
您提供了代码段
for (int i = 10; i < 10000000; i *= 10) {
System.out.println(((int) (Math.log10(i)) + 1) +
" " + ((int) (Math.log(i) / Math.log(10)) + 1));
}
来说明你的问题.只需删除强制转换为int并再次运行循环即可.您将收到
2.0 2.0
3.0 3.0
4.0 3.9999999999999996
5.0 5.0
6.0 6.0
7.0 6.999999999999999
可以立即回答您的问题.正如tliff所说,强制转换会舍弃小数而不是正确舍入.
编辑:您更新了您的问题以使用floor(),但像铸造floor()会四舍五入,因此会删除小数!
内容总结
以上是互联网集市为您收集整理的java-为什么log(1000)/ log(10)与log10(1000)不同?全部内容,希望文章能够帮你解决java-为什么log(1000)/ log(10)与log10(1000)不同?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。