gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:57:17 24 4
gpt4 key购买 nike

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

// say the number is 1000
(int)(log(1000)/log(10)) + 1

这是基于数学公式

log10x = lognx/log n10(解释 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) 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1497400/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com