在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);
}
使用此修复程序(number = number + 0.000000001;) 我得到0.15
有更好的方法吗?
答案 0 :(得分:1)
你提到的舍入也称为“银行家舍入”,如果一个数字要四舍五入到n位,那么如果n + 1位是5,那么第n位将四舍五入到最接近的偶数,
e.g。四舍五入:
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
答案 1 :(得分:0)
Math.round()
将以整数为您完成工作。您可以通过将数字乘以10的幂,然后再舍入,然后除以相同的数字来做一个很好的方法。
@Example:十进制舍入
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round
和它们之间的基准。
http://jsperf.com/roundingnumbers2
所以我的方法比其他人快:),但对于非常大的数字来说不是很安全
答案 2 :(得分:0)
如果纯粹是关于格式化货币值,您可以使用accounting.js
等专用库。
accounting.toFixed(0.615, 2); // "0.62"
accounting.formatMoney(12345678); // $12,345,678.00
accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99
答案 3 :(得分:0)
出于好奇,这是一种处理整数除法的技术,甚至舍入是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可能会超出允许范围。