ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-为什么log(1000)/ log(10)与log10(1000)不同?

2019-10-11 05:04:28  阅读:332  来源: 互联网

标签:c-3 logarithm java math


今天,我遇到了一个很奇怪的问题.我需要计算数字的字符串长度,所以我想出了这个解决方案

// 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()会四舍五入,因此会删除小数!

标签:c-3,logarithm,java,math
来源: https://codeday.me/bug/20191011/1890105.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有