基于对数的解决方案计算大整数中的错误位数

时间:2016-01-14 04:13:02

标签: java math numbers

我还没有足够的声望点留下评论,但是当人们(错误地)建议使用log10来计算正整数中的位数时,我看到了很多次。对于大数字来说这是错误的!

<!DOCTYPE html>
<html>

  <head>
    <script src="https://code.angularjs.org/2.0.0-beta.0/angular2-polyfills.js"></script>
    <script src="https://code.angularjs.org/tools/system.js"></script>
    <script src="https://code.angularjs.org/tools/typescript.js"></script>
    <script src="https://code.angularjs.org/2.0.0-beta.0/Rx.js"></script>
    <script src="https://code.angularjs.org/2.0.0-beta.0/angular2.dev.js"></script>

    <script>
      System.config({
        transpiler: 'typescript', 
        typescriptOptions: { emitDecoratorMetadata: true }, 
        packages: {'gg': {defaultExtension: 'tp'}} 
      });
      System.import('boot')
            .then(null, console.error.bind(console));
    </script>
  </head>

  <body>
    <my-app>Loading...</my-app>
  </body>

</html>

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

我想了解原因。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

在数学上绝对正确。

任何非空(正数!)的整数位数是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