多了java0.log和_java-为什么log(1000)/ log(10)与log10(1000)不同?

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

// 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位数字.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值