【问题标题】:Logarithm-based solution calculates incorrect number of digits in large integers基于对数的解决方案计算大整数中不正确的位数
【发布时间】:2016-04-19 07:25:31
【问题描述】:

我还没有足够的声望点离开 cmets,但我看到很多次人们(错误地)建议使用 log10 来计算正整数的位数。这对于大数来说是错误的!

long n = 99999999999999999L;

// correct answer: 17
int numberOfDigits = String.valueOf(n).length();

// incorrect answer: 18
int wrongNumberOfDigits = (int) (Math.log10(n) + 1); 
// also incorrect:
double wrongNumberOfDigits2 = Math.floor(Math.log10(n) + 1);

基于对数的解决方案将错误地输出 18 而不是 17。

我想知道为什么。

Way to get number of digits in an int?
Fastest way to get number of digits on a number?

【问题讨论】:

  • 你真的有问题吗?
  • 我想了解为什么它对于大数是不正确的,并且还想引起人们对这一事实的认识。

标签: java math numbers


【解决方案1】:

问题是99999999999999999 在这种情况下不能精确地表示为(双精度)浮点值。当作为double 参数传递给log10 时,最接近的值为1.0E+17

log10(n) 值也是如此:16.999999999999999995657... - 可以表示的最接近的值是 17

【讨论】:

  • 感谢您的解释!我想知道基于对数的解决方案正确的最大长整数是多少?
  • @moodcheerful - 你真正想问的是:可以精确表示的连续整数值的范围是多少?有一个很好的答案here
【解决方案2】:

数学上绝对正确。

任何非空整数(正数!)的位数为 log10(n)+1。毫无疑问!

正如 Brett Hale 所指出的那样,表示会出现问题。

所以,如果你愿意,没问题,没有限制,非常准确的计算:) 使用 BigDecimal。

但最简单:使用 lengthof String:

Long l=99999999999999999L;
int len=l.toString().length();

如果你真的想进行计算,请参阅

那个:Logarithm of a BigDecimal

那个:BigDecimal to the power of BigDecimal on Java/Android

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多