在 JavaScript 中用正好两个小数来格式化数字更新:
2022-08-29 22:39:30
我有这行代码,它将我的数字四舍五入到小数点后两位。但我得到的数字是这样的:10.8,2.4,等等。这些不是我对小数点后两位的想法,所以我如何改进以下内容?
Math.round(price*Math.pow(10,2))/Math.pow(10,2);
我想要像10.80,2.40等数字。使用jQuery对我来说很好。
我有这行代码,它将我的数字四舍五入到小数点后两位。但我得到的数字是这样的:10.8,2.4,等等。这些不是我对小数点后两位的想法,所以我如何改进以下内容?
Math.round(price*Math.pow(10,2))/Math.pow(10,2);
我想要像10.80,2.40等数字。使用jQuery对我来说很好。
要使用定点表示法设置数字的格式,只需使用 toFixed 方法:
(10.8).toFixed(2); // "10.80"
var num = 2.4;
alert(num.toFixed(2)); // "2.40"
请注意,返回一个字符串。toFixed()
重要说明:请注意,toFixed 在 90% 的时间内不会四舍五入,它将返回舍入值,但在许多情况下,它不起作用。
例如:
2.005.toFixed(2) === "2.00"
如今,您可以使用Intl.NumberFormat
构造函数。它是 ECMAScript Internationalization API Specification (ECMA402) 的一部分。它具有非常好的浏览器支持,甚至包括IE11,并且在Node.js中完全支持它。
const formatter = new Intl.NumberFormat('en-US', {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
});
console.log(formatter.format(2.005)); // "2.01"
console.log(formatter.format(1.345)); // "1.35"
您也可以使用该方法,该方法在内部将使用 API:toLocaleString
Intl
const format = (num, decimals) => num.toLocaleString('en-US', {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
});
console.log(format(2.005)); // "2.01"
console.log(format(1.345)); // "1.35"
此 API 还为您提供了多种格式选项,如千位分隔符、货币符号等。
这是一个古老的话题,但仍然是排名靠前的Google结果,并且提供的解决方案具有相同的浮点小数问题。这是我使用的(非常通用的)函数,多亏了MDN:
function round(value, exp) {
if (typeof exp === 'undefined' || +exp === 0)
return Math.round(value);
value = +value;
exp = +exp;
if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0))
return NaN;
// Shift
value = value.toString().split('e');
value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp)));
// Shift back
value = value.toString().split('e');
return +(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp));
}
正如我们所看到的,我们没有得到这些问题:
round(1.275, 2); // Returns 1.28
round(1.27499, 2); // Returns 1.27
这种通用性也提供了一些很酷的东西:
round(1234.5678, -2); // Returns 1200
round(1.2345678e+2, 2); // Returns 123.46
round("123.45"); // Returns 123
现在,要回答OP的问题,必须输入:
round(10.8034, 2).toFixed(2); // Returns "10.80"
round(10.8, 2).toFixed(2); // Returns "10.80"
或者,对于更简洁、更不通用的函数:
function round2Fixed(value) {
value = +value;
if (isNaN(value))
return NaN;
// Shift
value = value.toString().split('e');
value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + 2) : 2)));
// Shift back
value = value.toString().split('e');
return (+(value[0] + 'e' + (value[1] ? (+value[1] - 2) : -2))).toFixed(2);
}
您可以通过以下方式调用它:
round2Fixed(10.8034); // Returns "10.80"
round2Fixed(10.8); // Returns "10.80"
各种示例和测试(感谢@t-j-crowder!):
function round(value, exp) {
if (typeof exp === 'undefined' || +exp === 0)
return Math.round(value);
value = +value;
exp = +exp;
if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0))
return NaN;
// Shift
value = value.toString().split('e');
value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp)));
// Shift back
value = value.toString().split('e');
return +(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp));
}
function naive(value, exp) {
if (!exp) {
return Math.round(value);
}
var pow = Math.pow(10, exp);
return Math.round(value * pow) / pow;
}
function test(val, places) {
subtest(val, places);
val = typeof val === "string" ? "-" + val : -val;
subtest(val, places);
}
function subtest(val, places) {
var placesOrZero = places || 0;
var naiveResult = naive(val, places);
var roundResult = round(val, places);
if (placesOrZero >= 0) {
naiveResult = naiveResult.toFixed(placesOrZero);
roundResult = roundResult.toFixed(placesOrZero);
} else {
naiveResult = naiveResult.toString();
roundResult = roundResult.toString();
}
$("<tr>")
.append($("<td>").text(JSON.stringify(val)))
.append($("<td>").text(placesOrZero))
.append($("<td>").text(naiveResult))
.append($("<td>").text(roundResult))
.appendTo("#results");
}
test(0.565, 2);
test(0.575, 2);
test(0.585, 2);
test(1.275, 2);
test(1.27499, 2);
test(1234.5678, -2);
test(1.2345678e+2, 2);
test("123.45");
test(10.8034, 2);
test(10.8, 2);
test(1.005, 2);
test(1.0005, 2);
table {
border-collapse: collapse;
}
table, td, th {
border: 1px solid #ddd;
}
td, th {
padding: 4px;
}
th {
font-weight: normal;
font-family: sans-serif;
}
td {
font-family: monospace;
}
<table>
<thead>
<tr>
<th>Input</th>
<th>Places</th>
<th>Naive</th>
<th>Thorough</th>
</tr>
</thead>
<tbody id="results">
</tbody>
</table>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>