2013-05-11 103 views
0

我似乎無法得到一個很好的數字四捨五入到最接近的百分數(即12.57而不是12.57000000008)。Javascript(node.js)Math.floor返回長十進制值

var example = { 
    user : "John", 
    dollars: 12.57 
}; 

setInterval(function() { 
    example.dollars += (parseInt(Math.floor(Math.random()*2000 + 500))/100); 
    console.log(example.dollars); 
}, 1000); 

我不斷收到類似的值:
15.20000000008
88.54000000007
86.36000000008

我是不是設置錯了東西在我的數學函數?

注意:這是在node.js中

+1

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html什麼每臺計算機科學家應該知道關於浮點運算 – Patashu 2013-05-11 00:39:25

回答

1

嘗試隔離數量起到第100位。即[86.36]000000008

var example = { 
    user : "John", 
    dollars: 12.57 
}; 

setInterval(function() { 
    var s, final; 
    example.dollars += (parseInt(Math.floor(Math.random() * 2000 + 500))/100); 

    s = example.dollars + .005 + '', 
    final = s.substring(0, s.indexOf('.') + 3); 
    console.log(final); 
}, 1000); 

所有我們正在做的是後消除一切百位小數。爲了做到這一點,我們需要找到小數位,所以我們可以找到每個說的百位十進制值。首先我們必須將數字轉換爲字符串,+ ''或者您可以使用toString()函數。然後我們使用indexOf('.')找到小數位置,最後我們計算三個地方。那會讓你的數字達到第100位,沒有很長的十進制值。

例子:
輸入:12.57000000008輸出:12.57
輸入:15.20000000008輸出:15.20

Working fiddle.

+0

感謝小提琴,但它顯示18.4而不是18.40如何解決這個問題? – 2013-05-11 05:34:57

+0

'+ .005'輪到最接近的百分之一。我最後的編輯應該是你的最終代碼 – 2013-05-11 15:20:54

2

Javascript編號是浮點數。他們不應該依賴於精確的小數運算。

例如,您可以進入到這一個js控制檯

.1 + .2 //0.30000000000000004 

一般來說,你可以在整數數學精確計算的,如果你需要精確到小數點更多的控制,你可以看看庫,例如this one它可以讓你在數字上設置錯誤界限,或者用更好的數字類型處理來調用用語言編寫的外部庫。

多個庫準確JS十進制數學:

+0

'1 + .2'返回'1.2 '。我認爲你的意思是'0.1 + 0.2' :) – LandonSchropp 2013-05-11 02:02:27

+0

複製粘貼失敗:) – 2013-05-11 02:05:31

+0

這是NodeJS的最佳答案。 Decimal軟件包將我固定下來。 – Doug 2015-08-01 16:25:21

1

如果你只需要支持現代瀏覽器中,toFixed方法是最好的選擇。它需要一個參數來表示舍入到的小數位數,並返回String

example.dollars.toFixed(2); // returns "12.57" 
+0

如果你確實需要支持舊瀏覽器,你可以使用'toFixed'和[es5-shim](https://github.com/es-shims/es5-shim)。 – LandonSchropp 2014-05-29 04:16:20

+0

不受nodejs支持 – Doug 2015-08-01 16:26:01