Java 基于对数的解决方案计算的大整数位数不正确
我还没有足够的声望点来发表评论,但我看到很多次有人(错误地)建议使用log10来计算正整数中的位数。这是错误的大数字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
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-你真正想问的是:可以精确表示的连续整数值的范围是什么?有一个很好的答案。