我还没有足够的声望点留下评论,但是当人们(错误地)建议使用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?
答案 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();
如果确实想要进行计算,请参阅