javascript - 如何将 javascript 函数舍入为 1.00 而不是 0.100?
问题描述
我有一个函数formatMoney
可以将数字转换为接近完美的数千个分隔字符串。我今天刚刚注意到,一旦输入数字为 x.995xxx,它就很难正确舍入。然后舍入到 0.1000 而不是 1.0000。
有任何解决这个问题的方法吗?几周前,我从 SO 线程中复制了以下函数,但再也找不到了。
n1 = 0.9940
n2 = 0.9950
$('#n1').html(formatMoney(n1, 2))
$('#n2').html(formatMoney(n2, 2))
function formatMoney(n, dp){
var s = ''+(Math.floor(n)), d = n % 1, i = s.length, r = '';
while ( (i -= 3) > 0 ) { r = '.' + s.substr(i, 3) + r; }
return s.substr(0, i + 3) + r +
(d ? ',' + Math.round(d * Math.pow(10, dp || 2)) : '');
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body>
<html>
<p> Correct Output: </p>
<div id="n1">0,9900</div>
<p> Current wrong output: </p>
<div id="n2">0,1000</div>
<p> Desired output: </p>
<div>1,0000</div>
</html>
</body>
解决方案
试试下面的方法。
function formatMoney(n, digits){
var negative = false;
if (digits === undefined) {
digits = 0;
}
if( n < 0) {
negative = true;
n = n * -1;
}
var multiplicator = Math.pow(10, digits);
n = parseFloat((n * multiplicator).toFixed(11));
n = (Math.round(n) / multiplicator).toFixed(digits);
if( negative ) {
n = (n * -1).toFixed(2);
}
//return n;
var mystring = n.toString().replace(/\B(?<!\.\d*)(?=(\d{3})+(?!\d))/g, ",");
mystring = mystring.replace(/[,.]/g, m => (m === ',' ? '.' : ','))
return mystring;
};
推荐阅读
- c# - 我们如何在 Excel 中使用 VTSO 确定 C# 中的数组类型?
- javascript - 如何防止jquery ajax跟随302重定向
- ios - 可以使用 CATransform3D 获取 Face Mesh 中的眼睛大小尺寸吗?
- docker-compose - 在“sudo apt install docker-compose”时获取以下错误信息
- amazon-web-services - 如何授予用户从控制台访问 AWS Elastic Beanstalk 日志的权限
- batch-file - 如何制作具有多个其他条件的批处理文件?
- python-2.7 - Python:获取动态TextInput的ID
- android - 网格视图项目没有向下滚动(重复项目)以及当我从 android 中的服务器加载数据时?
- office365 - 调用 Graph API /beta/me/joinedTeams 失败
- javascript - Bootstrap:Multiselect:Onchange取消选中复选框