在JavaScript中,当从浮点数转换为字符串时,如何才能在小数点后得到2位数字?例如,0.34而不是0.3445434。
当前回答
也许你还需要小数分隔符?这是我刚刚创建的一个函数:
function formatFloat(num,casasDec,sepDecimal,sepMilhar) {
if (num < 0)
{
num = -num;
sinal = -1;
} else
sinal = 1;
var resposta = "";
var part = "";
if (num != Math.floor(num)) // decimal values present
{
part = Math.round((num-Math.floor(num))*Math.pow(10,casasDec)).toString(); // transforms decimal part into integer (rounded)
while (part.length < casasDec)
part = '0'+part;
if (casasDec > 0)
{
resposta = sepDecimal+part;
num = Math.floor(num);
} else
num = Math.round(num);
} // end of decimal part
while (num > 0) // integer part
{
part = (num - Math.floor(num/1000)*1000).toString(); // part = three less significant digits
num = Math.floor(num/1000);
if (num > 0)
while (part.length < 3) // 123.023.123 if sepMilhar = '.'
part = '0'+part; // 023
resposta = part+resposta;
if (num > 0)
resposta = sepMilhar+resposta;
}
if (sinal < 0)
resposta = '-'+resposta;
return resposta;
}
其他回答
使用toFixed()时要小心:
首先,使用数字的二进制表示来四舍五入,这可能会导致意想不到的行为。例如
(0.595).toFixed(2) === '0.59'
而不是‘0.6’。
其次,toFixed()存在IE错误。在IE中(至少到版本7,没有检查IE8),以下是正确的:
(0.9).toFixed(0) === '0'
遵循kkyy的建议或使用自定义toFixed()函数可能是一个好主意,例如
function toFixed(value, precision) {
var power = Math.pow(10, precision || 0);
return String(Math.round(value * power) / power);
}
使用乘法器的所有解都存在一个问题。不幸的是,kkyy和Christoph的解决方案都是错误的。
请测试数字551.175的小数点后2位-它将四舍五入为551.17,而它应该是551.18 !但是如果你测试的是451.175,就可以了- 451.18。所以第一眼很难发现这个错误。
问题在于乘法:尝试551.175 * 100 = 55117.49999999999 (up !)
所以我的想法是在使用Math.round()之前用toFixed()处理它;
function roundFix(number, precision)
{
var multi = Math.pow(10, precision);
return Math.round( (number * multi).toFixed(precision + 1) ) / multi;
}
var result = Math.round(original*100)/100;
具体细节,以防代码不是自解释的。
编辑:…或者直接使用toFixed,就像Tim Büthe提议的那样。忘记了,谢谢你的提醒(还有点赞):)
countDecimals = value => { if (Math.floor(value) === value) return 0; let stringValue = value.toString().split(".")[1]; if (stringValue) { return value.toString().split(".")[1].length ? value.toString().split(".")[1].length : 0; } else { return 0; } }; formatNumber=(ans)=>{ let decimalPlaces = this.countDecimals(ans); ans = 1 * ans; if (decimalPlaces !== 0) { let onePlusAns = ans + 1; let decimalOnePlus = this.countDecimals(onePlusAns); if (decimalOnePlus < decimalPlaces) { ans = ans.toFixed(decimalPlaces - 1).replace(/\.?0*$/, ""); } else { let tenMulAns = ans * 10; let decimalTenMul = this.countDecimals(tenMulAns); if (decimalTenMul + 1 < decimalPlaces) { ans = ans.toFixed(decimalPlaces - 1).replace(/\.?0*$/, ""); } } } }
我只是给这个值加上1,然后数出原始值和增加的值中出现的十进制数字。如果我在比原始十进制数字少加1之后找到十进制数字,我只调用toFixed() with(原始小数- 1)。我还通过将原始值乘以10来检查,并遵循相同的逻辑,以防加1不会减少冗余小数位。 在JS中处理浮点数舍入的简单变通方法。我试过的大多数情况下都有效。
var x = 0.3445434
x = Math.round (x*100) / 100 // this will make nice rounding
推荐文章
- Python中的最大浮点数是多少?
- 如何清除所有<div>的内容在一个父<div>?
- 检测用户何时离开网页的最佳方法?
- 当“模糊”事件发生时,我如何才能找到哪个元素的焦点去了*到*?
- React不会加载本地图像
- 如何将Blob转换为JavaScript文件
- 在另一个js文件中调用JavaScript函数
- 如何在svg元素中使用z索引?
- 如何求一个数的长度?
- 跨源请求头(CORS)与PHP头
- 如何用Express/Node以编程方式发送404响应?
- parseInt(null, 24) === 23…等等,什么?
- JavaScript变量声明在循环外还是循环内?
- 元素在“for(…in…)”循环中排序
- 在哪里放置JavaScript在HTML文件?