使用JavaScript将数字格式化为仅保留两位小数

647

我有一行代码可以将数字四舍五入到两位小数。但是,我得到的数字像这样:10.8、2.4等。这不是我认为的两位小数,请问如何改进以下代码?

Math.round(price*Math.pow(10,2))/Math.pow(10,2);

我希望得到像10.80、2.40这样的数字。使用jQuery也可以。


1
你的代码正是我所需要的(用于将浮点数精度减少到7位小数以生成较小的JSON文件)。为了提高速度,跳过Math.pow,使用以下代码:val = Math.round(val * 10000000) / 10000000); - Pawel
由于当前接受的答案(https://dev59.com/anI-5IYBdhLWcg3wsKl4#1726662)由于数字固有的严重不精确性(0.565、0.575、1.005)在广泛数值范围内给出了一个错误的结果,我可以建议再次查看这个答案(https://dev59.com/anI-5IYBdhLWcg3wsKl4#21323330),它可以得到正确的结果。 - T.J. Crowder
也许你想为JavaScript包含一个sprintf库。https://dev59.com/YXRB5IYBdhLWcg3weXOX - Thilo
3
在使用十进制位移和四舍五入方法正确地进行舍入后,您可以使用number.toFixed(x)方法将其转换为具有所需零数量的字符串。例如,使用跨浏览器方法将1.34舍入为1.3,然后添加1个零并使用1.3.toFixed(2)转换为字符串(以获取"1.30")。 - Edward
到了2020年,JavaScript中没有一种简单的本地方法可以轻松地将数字四舍五入。哇。 - Sliq
const formattedNumber = Math.round(number * 100) / 100; 将数字乘以100并四舍五入,然后再除以100,得到格式化后的数字。 - Hamza Dahmoun
32个回答

1

parse = function (data) {
       data = Math.round(data*Math.pow(10,2))/Math.pow(10,2);
       if (data != null) {
            var lastone = data.toString().split('').pop();
            if (lastone != '.') {
                 data = parseFloat(data);
            }
       }
       return data;
  };

$('#result').html(parse(200)); // output 200
$('#result1').html(parse(200.1)); // output 200.1
$('#result2').html(parse(200.10)); // output 200.1
$('#result3').html(parse(200.109)); // output 200.11
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<div id="result"></div>
<div id="result1"></div>
<div id="result2"></div>
<div id="result3"></div>


1
Number(((Math.random() * 100) + 1).toFixed(2))

这将返回一个1到100之间的随机数,保留两位小数。

1

使用此响应作为参考: https://dev59.com/anI-5IYBdhLWcg3wsKl4#21029698

我创建了一个函数来获取动态小数位数:

function toDec(num, dec)
{
        if(typeof dec=='undefined' || dec<0)
                dec = 2;

        var tmp = dec + 1;
        for(var i=1; i<=tmp; i++)
                num = num * 10;

        num = num / 10;
        num = Math.round(num);
        for(var i=1; i<=dec; i++)
                num = num / 10;

        num = num.toFixed(dec);

        return num;
}

以下是一个工作示例:https://jsfiddle.net/wpxLduLc/


0
(Math.round((10.2)*100)/100).toFixed(2)

这应该产生:10.20

(Math.round((.05)*100)/100).toFixed(2)

这应该返回:0.05

(Math.round((4.04)*100)/100).toFixed(2)

应该产生:4.04 等等。

0

你也可以使用 .toPrecision() 方法和一些自定义代码,无论整数部分的长度如何,始终向第n位小数四舍五入。

function glbfrmt (number, decimals, seperator) {
    return typeof number !== 'number' ? number : number.toPrecision( number.toString().split(seperator)[0].length + decimals);
}

你也可以将它制作成插件以便更好地使用。


0
fun Any.twoDecimalPlaces(numInDouble: Double): String {

    return "%.2f".format(numInDouble)
}

0

/*Due to all told stuff. You may do 2 things for different purposes:
When showing/printing stuff use this in your alert/innerHtml= contents:
YourRebelNumber.toFixed(2)*/

var aNumber=9242.16;
var YourRebelNumber=aNumber-9000;
alert(YourRebelNumber);
alert(YourRebelNumber.toFixed(2));

/*and when comparing use:
Number(YourRebelNumber.toFixed(2))*/

if(YourRebelNumber==242.16)alert("Not Rounded");
if(Number(YourRebelNumber.toFixed(2))==242.16)alert("Rounded");

/*Number will behave as you want in that moment. After that, it'll return to its defiance.
*/


0

我正在修复修改器的问题。 仅支持2位小数。

$(function(){
  //input number only.
  convertNumberFloatZero(22); // output : 22.00
  convertNumberFloatZero(22.5); // output : 22.50
  convertNumberFloatZero(22.55); // output : 22.55
  convertNumberFloatZero(22.556); // output : 22.56
  convertNumberFloatZero(22.555); // output : 22.55
  convertNumberFloatZero(22.5541); // output : 22.54
  convertNumberFloatZero(22222.5541); // output : 22,222.54

  function convertNumberFloatZero(number){
 if(!$.isNumeric(number)){
  return 'NaN';
 }
 var numberFloat = number.toFixed(3);
 var splitNumber = numberFloat.split(".");
 var cNumberFloat = number.toFixed(2);
 var cNsplitNumber = cNumberFloat.split(".");
 var lastChar = splitNumber[1].substr(splitNumber[1].length - 1);
 if(lastChar > 0 && lastChar < 5){
  cNsplitNumber[1]--;
 }
 return Number(splitNumber[0]).toLocaleString('en').concat('.').concat(cNsplitNumber[1]);
  };
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>


0
这是一个TypeScript实现https://dev59.com/anI-5IYBdhLWcg3wsKl4#21323330。它还通过函数简化了事情,并允许可选的数字偏移量。
export function round(rawValue: number | string, precision = 0, fractionDigitOffset = 0): number | string {
  const value = Number(rawValue);
  if (isNaN(value)) return rawValue;

  precision = Number(precision);
  if (precision % 1 !== 0) return NaN;

  let [ stringValue, exponent ] = scientificNotationToParts(value);

  let shiftExponent = exponentForPrecision(exponent, precision, Shift.Right);
  const enlargedValue = toScientificNotation(stringValue, shiftExponent);
  const roundedValue = Math.round(enlargedValue);

  [ stringValue, exponent ] = scientificNotationToParts(roundedValue);
  const precisionWithOffset = precision + fractionDigitOffset;
  shiftExponent = exponentForPrecision(exponent, precisionWithOffset, Shift.Left);

  return toScientificNotation(stringValue, shiftExponent);
}

enum Shift {
  Left = -1,
  Right = 1,
}

function scientificNotationToParts(value: number): Array<string> {
  const [ stringValue, exponent ] = value.toString().split('e');
  return [ stringValue, exponent ];
}

function exponentForPrecision(exponent: string, precision: number, shift: Shift): number {
  precision = shift * precision;
  return exponent ? (Number(exponent) + precision) : precision;
}

function toScientificNotation(value: string, exponent: number): number {
  return Number(`${value}e${exponent}`);
}

0

这非常简单,与其他任何方法一样有效:

function parseNumber(val, decimalPlaces) {
    if (decimalPlaces == null) decimalPlaces = 0
    var ret = Number(val).toFixed(decimalPlaces)
    return Number(ret)
}

由于toFixed()只能在数字上调用,并且不幸的是返回一个字符串,因此它可以在两个方向上为您执行所有解析。您可以传递一个字符串或数字,每次都会得到一个数字!调用parseNumber(1.49)将给您1,而parseNumber(1.49,2)将给您1.50。就像最好的一样!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接