我有一个浮点数,例如 137.57667565656,但我想对其进行舍入,以便小数点后只有两位尾随数字,例如新的浮点数将是 137.58。
到目前为止我试过这个:
(Math.round((value*100)/100)).toFixed(2).toString();
但不幸的是,它将我的值四舍五入为 137.00。它将小数位添加为零,为什么?
我怎样才能实现上述目标?
我有一个浮点数,例如 137.57667565656,但我想对其进行舍入,以便小数点后只有两位尾随数字,例如新的浮点数将是 137.58。
到目前为止我试过这个:
(Math.round((value*100)/100)).toFixed(2).toString();
但不幸的是,它将我的值四舍五入为 137.00。它将小数位添加为零,为什么?
我怎样才能实现上述目标?
你期待什么?
(value*100)/100
简单地返回 value 的原始值,所以
Math.round((value*100)/100))
等同于:
Math.round(value)
然后你有:
Math.round(value).toFixed(2).toString();
所以value被四舍五入为整数,toFixed将添加两位小数并返回一个字符串,因此toString部分是多余的。如果您希望将值四舍五入到小数点后四位,则:
value.toFixed(4)
将完成这项工作:
var x = 137.57667565656;
console.log(x.toFixed(4)); // 137.5767
如果要将其四舍五入到 2 位但将其显示为 4,则:
Number(x.toFixed(2)).toFixed(4) // 137.5800
添加两个零是因为在您所做的一切之前Math.round
:
如果 number 的小数部分是 0.5 或更大,则将参数四舍五入到下一个更高的整数。如果 number 的小数部分小于 0.5,则将参数四舍五入到下一个较小的整数。
你需要的是放弃Math.round
:
(value*100)/100).toFixed(4).toString();
在 JSFiddle 上查看:http: //jsfiddle.net/0fe5mm95/
编辑显然我误解了这个问题。当我试图回答时(至少在标题中)是关于有效数字。
这个答案与维基百科对有效数字的定义一致。对于任意数量的有效数字,它通过三个步骤解决了一般问题:
-1<x<1
,例如 5 表示 12345,或 -2 表示 0.01)就这样。除了零,它没有有效数字。(当要求三个有效数字时,我选择了“0.00”,但 0 或 0.0 也可以)
function toStringWithSignificantDigits( x, len ){
if(x==0) return x.toFixed(len-1); // makes little sense for 0
var numDigits = Math.ceil(Math.log10(Math.abs(x)));
var rounded = Math.round(x*Math.pow(10,len-numDigits))*Math.pow(10,numDigits-len);
return rounded.toFixed(Math.max(len-numDigits,0));
}
function testIt(x,len){
console.log( "format " + x + " to " + len + " significant digits: " + toStringWithSignificantDigits(x,len));
}
testIt(12.345,6); // 12.3450
testIt(12.345,5); // 12.345
testIt(12.345,4); // 12.35
testIt(12.345,3); // 12.3
testIt(12.345,2); // 12
testIt(12.345,1); // 10
testIt(0.012345,7); // 0.01234500
testIt(0.012345,6); // 0.0123450
testIt(0.012345,5); // 0.012345
testIt(0.012345,4); // 0.01235
testIt(0.012345,3); // 0.0123
testIt(0.012345,2); // 0.012
testIt(0.012345,1); // 0.01
testIt(0,3); // 0.00, zero is a special case, as it has no significant digit