2016-09-29 59 views
5

我有兩個負值-0.245-9.085。我想讓他們到2位小數。我正在使用JavaScript函數toFixed()但得到一些奇怪的結果。回合負值到小數點後2位

請幫我下站的第一個例子背後的邏輯是圓的「下降」,但第二個是圓的「向上」

//Examples 1. result coming as expected 
 
var num = -0.245 
 
var n = num.toFixed(2); //-0.24 
 
console.log(n); 
 

 
//Examples 2. result should be -9.08 
 
num = -9.085 
 
n = num.toFixed(2); //-9.09 
 
console.log(n);

+0

什麼結果你得到? –

+0

示例1答案(-0.24)是我想要的答案,根據該示例2,答案應該是-9.08,而不是-9.09。 –

+0

[浮點數學是否被破壞?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken)在這裏可能是相關的。 –

回答

0

請檢查,這可以幫助你很多在瞭解此背後的邏輯: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed

+2

請不要只發佈一個鏈接。我已經看過那個網站,它沒有解釋問題 – mplungjan

+0

@mplungjan指的是http://www.ecma-international.org/ecma-262/5.1/#sec-15.7.4.5,指向8.a。解析'0時有一些問題。 ......價值。 – Rajesh

+0

在此函數中,當您的舍入值之前的值大於或等於五時,toFixed()舍入正在工作。例如:在這種情況下(0.245).toFixed(2);有4小於舍入值,所以它不會增加4到5.但在這種情況下(0.255).toFixed(2);它顯示0.26。 –

0

此函數舍入值。例如。如果值在9.080到9.084之間,結果將是9.08,如果值是9.085到9.089,結果將是9.09。

+0

這是POSTIVE數字的邏輯。這是合乎邏輯的,-9.085將四捨五入到-9.08 – mplungjan

+2

這也不能解釋爲什麼這兩個例子的取整方式不同。 – Turnip

+0

@mplungjan:我沒有明白你對+ ve和-ve數字的看法。請詳細說明。 –

0

enter image description here

parseFloat(Math.round(num * 100)/100).toFixed(2); 
+0

做一個片段。然後使用9.085 – mplungjan

+0

這個答案並沒有真正描述它是如何解決這個問題的。考慮編輯它以包含一些細節?包含代碼截圖也不是一個好主意;而是使用SO的降價來寫出代碼。 – brandonscript

0

toFixed()返回numObj的字符串表示不使用指數記數法並具有小數點後的數字準確的數字。 如有必要,數字被舍入,,如果需要,小數部分用零填充,以使其具有指定的長度。

這意味着結果沒有錯,但你期待toFixed()做一些不同的事情。 如果將-9.085四捨五入到小數點後第二位,數學上的正確結果爲-9.09(.5小數點後一位)。 你所要完成的是刪除第二小數點後一切都可以與實現:

parseInt(-9.085 * 100)/100 //-9.08 

alert(parseInt(-9.085 * 100)/100)

+0

這是如何合乎邏輯的。舍入-9.085 UP是-9.08 - 你的partInt比parseFloat的確更好。 – mplungjan

+0

我忘記了它的負數。但是我查了一下,沒有什麼正確的規則如何整理,但多個。看起來JavaScript決定把它整理成一個正整數。 在維基百科中,負數用絕對值四捨五入。 –

+0

此外,您的代碼可能會失敗,因爲某些數字不能很好地對齊 – mplungjan

2

按照說明 在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed 提到:

如果需要,數字爲四捨五入,小數部分爲如有必要,填充零以使其具有指定的長度。

對於-0.245.toFixed(2),該值是負的,後2位小數的值是-0.045,-0.045大於-0.05更高,因此結果被舍入到-0.24

對於-9.085.toFixed(2),該值爲負,小數點後2位的值爲-0.085,-0.085小於-0.08,因此結果向下舍入爲-9.09

下面是解決方案總是舍入小數點後兩位來表示負值。

var num = -9.085 
 
var output = num < 0 ? Math.floor(Math.abs(num) * 100) * -1/100 : num.toFixed(2) 
 
console.log(output) //-9.08

+0

這可能工作,但實際上並沒有回答OP的問題 - _「請幫助我在第一個例子被舍入」倒「後面的邏輯,但第二個被四捨五入「up」「_ – Turnip

+0

@Rajesh,因爲用戶總是將負值舍入到小數點後兩位,我們可以將該值轉換爲正數並使用Math.floor將值舍入到小數點後兩位 – alpha

+0

試試'0.245'或'0.236'。兩者都會返回前面評論的'0.24' – Rajesh

相關問題