Java 基于对数的解决方案计算的大整数位数不正确

Java 基于对数的解决方案计算的大整数位数不正确,java,math,numbers,Java,Math,Numbers,我还没有足够的声望点来发表评论,但我看到很多次有人(错误地)建议使用log10来计算正整数中的位数。这是错误的大数字 long n = 99999999999999999L; // correct answer: 17 int numberOfDigits = String.valueOf(n).length(); // incorrect answer: 18 int wrongNumberOfDigits = (int) (Math.log10(n) + 1); // also inc

我还没有足够的声望点来发表评论,但我看到很多次有人(错误地)建议使用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

我想知道为什么



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


log10(n)
值也是如此:
16.99999999999995657…
-可以表示的最近值是
17

它在数学上绝对正确

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

正如布雷特·黑尔所指出的那样,陈述中出现了问题

因此,如果您愿意,无问题、无限制、非常精确的计算:)使用BigDecimal。

但最简单:使用字符串的长度:

Long l=99999999999999999L;
int len=l.toString().length();
如果确实要进行计算,请参阅

即:


那:

你真的有问题吗?我想了解为什么它对于大数字是不正确的,并且想让大家了解这个事实。谢谢你的解释!我想知道最大的长整数是什么,基于对数的解决方案是正确的?@moodcheerful-你真正想问的是:可以精确表示的连续整数值的范围是什么?有一个很好的答案。