我想将数字格式化为始终显示2个小数位,并在适用的情况下四舍五入。
例子:
number display
------ -------
1 1.00
1.341 1.34
1.345 1.35
我一直在使用这个:
parseFloat(num).toFixed(2);
但它显示1
为1
,而不是1.00
。
我想将数字格式化为始终显示2个小数位,并在适用的情况下四舍五入。
例子:
number display
------ -------
1 1.00
1.341 1.34
1.345 1.35
我一直在使用这个:
parseFloat(num).toFixed(2);
但它显示1
为1
,而不是1.00
。
Answers:
1
显示为1.00
,并1.341
显示为1.34
。
Number(1).toFixed(2); // 1.00
Number(1.341).toFixed(2); // 1.34
Number(1.345).toFixed(2); // 1.34 NOTE: See andy's comment below.
Number(1.3450001).toFixed(2); // 1.35
1.34
表达的机会Number(1.345).toFixed(2)
。
1.345
就是不能精确存储在浮点数中的一个例子,所以我认为它没有按您期望的那样四舍五入的原因是它实际上被存储为一个数字小于1.345并向下舍入。如果用代替,(1.34500001).toFixed(2)
那么您会看到它正确舍入到1.35
如果,此答案将失败value = 1.005
。
作为更好的解决方案,可以通过使用指数表示法表示的数字来避免舍入问题:
Number(Math.round(1.005+'e2')+'e-2'); // 1.01
@Kon和原始作者建议的更干净的代码:
Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces)
您可以toFixed()
在末尾添加以保留小数点,例如:,1.00
但请注意,它将以字符串形式返回。
Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces).toFixed(decimalPlaces)
toFixed
存在四舍五入的问题。您的答案应该是被接受的。
Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces)
var num = new Number(14.12);
console.log(num.toPrecision(2));//outputs 14
console.log(num.toPrecision(3));//outputs 14.1
console.log(num.toPrecision(4));//outputs 14.12
console.log(num.toPrecision(5));//outputs 14.120
toPrecision
仅将数字格式化为特定的小数位数,只是省略多余的位数,而不舍入它们。当然,这也可能非常有用,但是了解差异非常重要。
(20.55).toPrecision(3) "20.6"
为了获得最精确的舍入,请创建以下函数:
function round(value, decimals) {
return Number(Math.round(value +'e'+ decimals) +'e-'+ decimals).toFixed(decimals);
}
并将其舍入到小数点后两位:
console.log("seeked to " + round(1.005, 2));
> 1.01
由于Razu,该文章,并MDN的Math.round参考。
对于现代浏览器,请使用toLocaleString
:
var num = 1.345;
num.toLocaleString(undefined, { maximumFractionDigits: 2, minimumFractionDigits: 2 });
将区域设置标签指定为控制小数点分隔符的第一个参数。对于点,请使用例如美国英语语言环境:
num.toLocaleString("en-US", { maximumFractionDigits: 2, minimumFractionDigits: 2 });
这使:
1.35
欧洲的大多数国家/地区使用逗号作为小数点分隔符,因此,例如,如果您使用瑞典语/瑞典语区域设置,则:
num.toLocaleString("sv-SE", { maximumFractionDigits: 2, minimumFractionDigits: 2 });
它会给:
1,35
toFixed
已经在stackoverflow.com/a/13292833/218196中建议了。您的问题还提供哪些其他信息?
toFixed
。
四舍五入到N位的通用解决方案
function roundN(num,n){
return parseFloat(Math.round(num * Math.pow(10, n)) /Math.pow(10,n)).toFixed(n);
}
console.log(roundN(1,2))
console.log(roundN(1.34,2))
console.log(roundN(1.35,2))
console.log(roundN(1.344,2))
console.log(roundN(1.345,2))
console.log(roundN(1.344,3))
console.log(roundN(1.345,3))
console.log(roundN(1.3444,3))
console.log(roundN(1.3455,3))
Output
1.00
1.34
1.35
1.34
1.35
1.344
1.345
1.344
1.346
roundN(-3.4028230607370965e+38,2)
返回"-3.4028230607370965e+38"
而不是预期的0.00
var number = 123456.789;
console.log(new Intl.NumberFormat('en-IN', { maximumFractionDigits: 2 }).format(number));
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat
如果您已经在使用jQuery,则可以考虑使用jQuery Number Format插件。
插件可以将格式化的数字作为字符串返回,您可以设置小数和千位分隔符,还可以选择显示的小数位数。
$.number( 123, 2 ); // Returns '123.00'
您还可以从GitHub获取jQuery Number Format。
你是这个意思吗?
function showAsFloat(num, n){
return !isNaN(+num) ? (+num).toFixed(n || 2) : num;
}
document.querySelector('#result').textContent =
[
'command | result',
'-----------------------------------------------',
'showAsFloat(1); | ' + showAsFloat(1),
'showAsFloat(1.314); | ' + showAsFloat(1.314),
'showAsFloat(\'notanumber\') | ' + showAsFloat('notanumber'),
'showAsFloat(\'23.44567\', 3) | ' + showAsFloat('23.44567', 3),
'showAsFloat(2456198, 5) | ' + showAsFloat('2456198', 5),
'showAsFloat(0); | ' + showAsFloat(0)
].join('\n');
<pre id="result"></pre>
将数字转换为字符串,仅保留两个小数:
var num = 5.56789;
var n = num.toFixed(2);
n的结果将是:
5.57
在需要特定格式的地方,您应该编写自己的例程或使用满足您需要的库函数。ECMAScript的基本功能通常不足以显示带格式的数字。
舍入和格式的完整说明在这里:http : //www.merlyn.demon.co.uk/js-round.htm#RiJ
通常,舍入和格式化仅应在输出之前作为最后一步执行。较早这样做可能会引入意想不到的大错误并破坏格式。
function number_format(string,decimals=2,decimal=',',thousands='.',pre='R$ ',pos=' Reais'){
var numbers = string.toString().match(/\d+/g).join([]);
numbers = numbers.padStart(decimals+1, "0");
var splitNumbers = numbers.split("").reverse();
var mask = '';
splitNumbers.forEach(function(d,i){
if (i == decimals) { mask = decimal + mask; }
if (i>(decimals+1) && ((i-2)%(decimals+1))==0) { mask = thousands + mask; }
mask = d + mask;
});
return pre + mask + pos;
}
var element = document.getElementById("format");
var money= number_format("10987654321",2,',','.');
element.innerHTML = money;
#format{
display:inline-block;
padding:10px;
border:1px solid #ddd;
background:#f5f5f5;
}
<div id='format'>Test 123456789</div>
您没有给我们提供全部信息。
javascript:alert(parseFloat(1).toFixed(2))
当我将1.00粘贴到位置栏中时,在浏览器中显示1.00。但是,如果您随后对其进行处理,它将还原。
var num = 2
document.getElementById('spanId').innerHTML=(parseFloat(num).toFixed(2)-1)
shows 1 and not 1.00
var quantity = 12;
var import1 = 12.55;
var total = quantity * import1;
var answer = parseFloat(total).toFixed(2);
document.write(answer);
我必须在parseFloat()和Number()转换之间做出决定,然后才能进行toFixed()调用。这是捕获用户输入后格式化数字的示例。
HTML:
<input type="number" class="dec-number" min="0" step="0.01" />
事件处理程序:
$('.dec-number').on('change', function () {
const value = $(this).val();
$(this).val(value.toFixed(2));
});
上面的代码将导致TypeError异常。请注意,尽管html输入类型是“数字”,但用户输入实际上是“字符串”数据类型。但是,toFixed()函数只能在为Number的对象上调用。
我的最终代码如下所示:
$('.dec-number').on('change', function () {
const value = Number($(this).val());
$(this).val(value.toFixed(2));
});
我偏爱使用Number()和parseFloat()进行转换的原因是,我既不必为空的输入字符串也不必为NaN值执行额外的验证。Number()函数将自动处理一个空字符串并将其隐藏为零。
我真的很喜欢:
var num = 12.749;
parseFloat((Math.round(num * 100) / 100).toFixed(2)); // 123.75
将数字四舍五入为2个小数点,然后确保将其解析parseFloat()
为返回Number而不是String,除非您不在乎它是String还是Number。
parseFloat("1.00") // 1
用精度方法扩展数学对象
Object.defineProperty(Math, 'precision',{
value: function (value,precision,type){
var v = parseFloat(value),
p = Math.max(precision,0)||0,
t = type||'round';
return (Math[t](v*Math.pow(10,p))/Math.pow(10,p)).toFixed(p);
}
});
console.log(
Math.precision(3.1,3), // round 3 digits
Math.precision(0.12345,2,'ceil'), // ceil 2 digits
Math.precision(1.1) // integer part
)
您可以尝试以下代码:
function FormatNumber(number, numberOfDigits = 2) {
try {
return new Intl.NumberFormat('en-US').format(parseFloat(number).toFixed(2));
} catch (error) {
return 0;
}
}
var test1 = FormatNumber('1000000.4444');
alert(test1); // 1,000,000.44
var test2 = FormatNumber(100000000000.55555555, 4);
alert(test2); // 100,000,000,000.56