请注意,我并不是在寻找舍入函数。我正在寻找一个函数,返回任意数字的简化十进制表示形式的小数位数。也就是说,我们有以下几点:在JavaScript中是否有可靠的方法来获取任意数字的小数位数?
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
我的第一反应是用字符串表示:各执'.'
,然后'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社区。你有没有人知道一个可靠的方法来获得数字的真正的小数点后精度?
任何人都应该问这个函数的目的是用于另一个将float转换为简化分数的函数(也就是说,它返回相对的coprime整数分子和非零自然分母)。在这个外部函数中唯一缺失的部分是确定浮点数的小数位数的可靠方法,所以我可以乘以10的适当幂。希望我可以超越它。
任何浮点数都有无穷多的小数位数。 – 2012-03-02 20:19:07
您可能感兴趣的:http://blog.thatscaptaintoyou.com/introducing-big-js-arbitrary-precision-math-for-javascript/ – 2012-03-02 20:20:59
@LightnessRacesinOrbit:对,我无法包括所有的细节标题!但是,我在问题中指定了我正在寻找简化表示法。 – Milosz 2012-03-02 20:29:44