[英]Rounding numbers in javascript
在javasript中圓形商業的最佳方法是什么?
例子:
0.145 -> ToString(2) -> 0.14
mathjs:
math.round(0.145, 2)) -> 0.14
帶圓形的數學戰俘也不會 100%
目前我使用:
function number_format(number, decimals, dec_point, thousands_sep) {
number = number + 0.000000001;
number = (number + '').replace(/[^0-9+\-Ee.]/g, '');
var n = !isFinite(+number) ? 0 : +number,
prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
s = '',
toFixedFix = function(n, prec) {
var k = Math.pow(10, prec);
return '' + Math.round(n * k) / k;
};
// Fix for IE parseFloat(0.55).toFixed(0) = 0;
s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
if (s[0].length > 3)
{
s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
}
if ((s[1] || '').length < prec) {
s[1] = s[1] || '';
s[1] += new Array(prec - s[1].length + 1).join('0');
}
return s.join(dec);
}
有了這個修復(數字 = 數字 + 0.000000001;)我得到 0.15
有沒有更好的方法來做到這一點?
您提到的四舍五入也稱為“銀行家的四舍五入”,如果一個數字要四舍五入到 n 位,那么如果 n+1 位是 5,則第 n 位將四舍五入到最接近的偶數,
例如四舍五入到 2 個位置:
2.345 => 2.34
2.335 => 2.34
以下可能適合,它沒有經過徹底測試,並且對可以四舍五入的數字大小有限制,但它顯示了一種方法。 它基於toFixed所以返回一個字符串。
function bankersRound(n, d) {
var a, b;
var p = String(n).split('.');
if (p[1]) {
a = p[1].substr(0, d);
b = p[1].substr(d, 1);
// If the d+1 character is 5 and the d character is even, force
// toFixed to round down
if (b == 5 && !(a%2)) {
n = p[0] + '.' + a + '4';
}
}
return Number(n).toFixed(d);
}
console.log(bankersRound(23.365, 2)); // 23.36
console.log(bankersRound(23.366, 2)); // 23.37
console.log(bankersRound(23.355, 2)); // 23.36
console.log(bankersRound(23.345, 2)); // 23.34
console.log(bankersRound(23.335, 2)); // 23.34
Math.round()
將以整數為您完成這項工作。 您可以通過將您的數字乘以 10 的冪,然后舍入,然后除以相同的數字來做一個很好的方法。
@示例:十進制舍入
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round
以及它們之間的基准。
http://jsperf.com/roundingnumbers2
所以我的方法比其他方法快 :),但對於非常大的數字不是很安全
如果純粹是關於格式化貨幣值,您可以使用專用庫,如accounting.js
。
accounting.toFixed(0.615, 2); // "0.62"
accounting.formatMoney(12345678); // $12,345,678.00
accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99
出於好奇,這里有一種處理整數除法的技術,甚至舍入是Daniel Lemire和Falk Hüffner討論的技術:
function roundToEven(n, d) {
var off = (n + d / 2)
var roundup = off / d;
var ismultiple = ((off % d) == 0);
return (d | (roundup ^ ismultiple)) & roundup;
}
Math.round(3/2);
2
roundToEven(3,2);
2
您可能會擔心溢出。 事實上,如果 n 和 d 都很大,則 n+d/2 可能會超出允許范圍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.