需要注意的是,我不是在寻找舍入函数。我正在寻找一个以任意数字的简化十进制表示形式返回小数位数的函数。也就是说,我们有以下内容:
decimalPlaces(5555.0); //=> 0
decimalPlaces(5555); //=> 0
decimalPlaces(555.5); //=> 1
decimalPlaces(555.50); //=> 1
decimalPlaces(0.0000005); //=> 7
decimalPlaces(5e-7); //=> 7
decimalPlaces(0.00000055); //=> 8
decimalPlaces(5.5e-7); //=> 8
我的第一直觉是使用字符串表示: split on '.'
,然后 on 'e-'
,然后做数学运算,就像这样(这个例子很冗长):
function decimalPlaces(number) {
var parts = number.toString().split('.', 2),
integerPart = parts[0],
decimalPart = parts[1],
exponentPart;
if (integerPart.charAt(0) === '-') {
integerPart = integerPart.substring(1);
}
if (decimalPart !== undefined) {
parts = decimalPart.split('e-', 2);
decimalPart = parts[0];
}
else {
parts = integerPart.split('e-', 2);
integerPart = parts[0];
}
exponentPart = parts[1];
if (exponentPart !== undefined) {
return integerPart.length +
(decimalPart !== undefined ? decimalPart.length : 0) - 1 +
parseInt(exponentPart);
}
else {
return decimalPart !== undefined ? decimalPart.length : 0;
}
}
对于我上面的示例,此功能有效。但是,在我测试了所有可能的值之前,我并不满意,所以我淘汰了Number.MIN_VALUE
.
Number.MIN_VALUE; //=> 5e-324
decimalPlaces(Number.MIN_VALUE); //=> 324
Number.MIN_VALUE * 100; //=> 4.94e-322
decimalPlaces(Number.MIN_VALUE * 100); //=> 324
起初这看起来很合理,但后来我意识到5e-324 * 10
应该是这样5e-323
!然后它击中了我:我正在处理非常小的数字量化的影响。不仅数字在存储之前被量化;此外,一些以二进制存储的数字具有不合理的十进制表示,因此它们的十进制表示被截断。这对我来说很不幸,因为这意味着我无法使用它们的字符串表示来获得它们真正的十进制精度。
所以我来找你,StackOverflow 社区。你们当中有没有人知道一种可靠的方法来获得一个数字的真正的小数点后精度?
如果有人问,此函数的目的是用于将浮点数转换为简化分数的另一个函数(即,它返回相对互质的整数分子和非零自然分母)。这个外部函数中唯一缺少的部分是确定浮点数中小数位数的可靠方法,因此我可以将其乘以 10 的适当幂。希望我想多了。