請注意,我並不是在尋找舍入函數。我正在尋找一個函數,返回任意數字的簡化十進制表示形式的小數位數。也就是說,我們有以下幾點:在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