2009-09-08 63 views
8

我有一個關於toFixed()函數的問題。如果我有漂浮物,例如 - 3.123123423 and 。如何將它輸出到帶有toFixed(2)的輸入框,以便輸入框值爲3.12和。我的意思是如果該值爲整數,我想它輸出不帶尾隨.00 :)Javascript to fixed功能

+2

您可能想指定3.1和3.005要發生的事情。 – Mark

+0

'parseFloat((value).toFixed(2))' –

回答

11

至於有整數之間沒有區別的,在JavaScript中漂浮,這是我quick'n'dirty方法:

theNumber.toFixed(2).replace(".00", ""); 

或者一些通用:

myToFixed = function (n, digits) { 
    digits = digits || 0; 
    return n.toFixed(digits).replace(new RegExp("\\.0{" + digits + "}"), ""); 
} 

myToFixed(32.1212, 2) --> "32.12" 
myToFixed(32.1212, 0) --> "32" 
myToFixed(32, 2) --> "32" 
myToFixed(32.1, 2) --> "32.10" 
+0

非常髒(而且非常快。)... +1 –

+1

不適用於3.005(意味着它是一個整數)。 – Mark

2
function toFixed0d(x, d) 
{ 
    if(Math.round(x) == x) 
    { 
     return x.toString(); 
    }else 
    { 
     return x.toFixed(d); 
    } 
} 

toFixed0d(3.123123423, 2) = "3.12" 
toFixed0d(0, 2) = "0" 
4

你不需要Math.round():

var toFixed = function(val, n) { 
    var result = val.toFixed(n); 
    if (result == val) 
    return val.toString(); 
    return result; 
} 

toFixed(3.123, 2) --> "3.12" 
toFixed(3, 2) --> "3" 
+0

PS:也適用於* .000..0,例如3.00.toString()==「3」 – Matthias

+1

這個失敗了toFixed(3.10,2) - >「3.1」,但應該是「3.10」,我猜。 – Fabian

+0

@Fabian好點! – Matthias

1

請注意,toFixed()是broken in IE並且通常不被依賴。令人討厭但精確四捨五入的替代功能。

0

這裏是我想出了思考這個同樣的問題,一小會兒後,一個功能:,這個函數將返回如下

function toFixed (number, n) { 
    return parseFloat(number.toFixed(n)); 
} 

按照這樣一個問題:

toFixed(3.123123423, 2); 
> 3.12 
toFixed(0, 2); 
> 0 
toFixed(3.1, 2); 
> 3.1 
toFixed(3.005, 2); 
> 3 
toFixed(3.005, 3); 
> 3.005 
toFixed(3.0500, 4); 
> 3.05 

請注意,對於JavaScript的Number對象,toFixed方法實際上會返回String。上述toFixed函數將返回一個Number。如果你寧願有一個String然後用下面的代替:

function toFixed (number, n) { 
    return parseFloat(number.toFixed(n)).toString(); 
} 
1

Number.toFixed產生一些奇怪的數學成績,給你你要的,不管你需要與否的小數位數。

Math.round在數學上是正確的,但不允許您指定精度。

這裏有一個數學上正確的函數(忽略浮點錯誤)並且給你你想要的東西。

var roundToPlusInfinity = function(n, fd) { 
    var scale = Math.pow(10, fd), 
     rounded = fd ? Math.floor((n * scale + 0.5))/scale : 
     Math.round(n); 
    return rounded.toString(); 
}; 

的算法爲:擴大,使得要輸入的數字是在小數點的左邊,添加0.5(使得> = 0.5在第一微不足道地方引起的整數部分的增量),截斷(不是圓的!)並縮小。浮點錯誤有可能蔓延,但它比可憐的toFixed函數好看得多。

測試出來:由於浮點錯誤的可能性

roundToPlusInfinity(5.53335, 4); // "5.3334" 
roundToPlusInfinity(-9999.95, 1); // "-9999.9" 
roundToPlusInfinity(3.00015, 3); // "3" 

,規模下降可能會給像「3.00000000001」的結果,這是煩人。像這樣的東西應該照顧它。

var trimFraction = function(s, fd) { 
    var splitPoint = s.indexOf('.'); 
    if (splitPoint === -1) { 
     return s; 
    } 

    var f = s.substring(splitPoint + 1, s.length), 
     i = s.substring(0, splitPoint); 
    if (f.length > fd) { 
     f = f.substring(0, fd).replace(/0+$/, ""); 
    } 
    if (f) { 
     return i + '.' + f; 
    } 
    return i; 
}; 

trimFraction("3.1000000001", 2); // "3.1" 

你還沒有明確你想要的舍入算法。向正無窮大舍入是你在學校學到的四捨五入,在這裏舍入> = .5 向上(即朝向正無窮大)。我相信在會計中,正確的舍入算法(至少在瑞士和阿根廷以外)遠離零。很簡單:

var roundAwayFromZero = function(n, fd) { 
    var ret = roundToPlusInfinity(Math.abs(n), fd); 
    return (n < 0) ? '-' + ret : ret; 
}; 

roundAwayFromZero(-9999.95, 1); // "-10000" 

如果結果是向人展示,Intl.NumberFormat是一種可能性,因爲你可以同時指定的最小和小數最大位數。在撰寫本文時,它並沒有得到廣泛的支持,並假設Chrome正確實施了規範,使用與固定相同的不可穿透和明顯的錯誤截斷算法。有趣的是,「貨幣」風格使用roundAwayFromZero(或者如果貨幣代碼是「CHF」,這是一個很好的接觸,則輪到一半)。