【问题标题】:How to parse float with two decimal places in javascript?如何在javascript中解析带有两位小数的浮点数?
【发布时间】:2011-05-25 00:36:15
【问题描述】:

我有以下代码。我想要这样,如果 price_result 等于一个整数,比如说 10,那么我想添加两位小数。所以 10 就是 10.00。 或者如果它等于 10.6 将是 10.60。不知道该怎么做。

price_result = parseFloat(test_var.split('$')[1].slice(0,-1));

【问题讨论】:

    标签: javascript floating-point


    【解决方案1】:

    您可以使用toFixed() 来做到这一点

    var twoPlacedFloat = parseFloat(yourString).toFixed(2)
    

    【讨论】:

    • 很高兴能提供帮助并继续努力——“每天都在学习新事物”
    • toFixed 虽然有很多问题。另外,这里有一个比 w3schools 更好的链接 developer.mozilla.org/en-US/docs/JavaScript/Reference/…
    • 但是 toFixed() 以字符串形式返回数字,如果要比较数字,则需要再次使用 parseFloat。
    • 使用var twoPlacedFloat = + parseFloat(yourString).toFixed(2) 转换为浮点数
    • 添加括号以获取数字而不是字符串:parseFloat((yourString).toFixed(2));
    【解决方案2】:

    如果您需要性能(例如在游戏中):

    Math.round(number * 100) / 100
    

    它的速度大约是 parseFloat(number.toFixed(2)) 的 100 倍

    http://jsperf.com/parsefloat-tofixed-vs-math-round

    【讨论】:

    • 用上面的公式 '2.00' 返回 2。但我希望它是 2.00。
    • 你不能同时拥有它。如果您希望输出是数字而不是字符串,那么您将不会得到尾随零。所以你可以使用上面的转换为字符串: var twoPlacedFloat = (Math.round(2.002745 * 100) / 100).toFixed(2);
    • 把100的换成200的速度会提高吗?
    • 如果浮点运算的次数不变,速度也不变,所以没有
    • @ncubica 它是关于小数位的。如果取 100,则逗号后 2 位,如果取 10,则逗号后 1 位,依此类推。
    【解决方案3】:

    当您使用toFixed 时,它总是将值作为字符串返回。这有时会使代码复杂化。为避免这种情况,您可以为 Number 创建一个替代方法。

    Number.prototype.round = function(p) {
      p = p || 10;
      return parseFloat( this.toFixed(p) );
    };
    

    并使用:

    var n = 22 / 7; // 3.142857142857143
    n.round(3); // 3.143
    

    或者简单地说:

    (22/7).round(3); // 3.143
    

    【讨论】:

    • 我编写了一个购物车程序并尝试使用链接到 parseFloat() 方法的 toFixed() 和 round() 方法。这些方法都不适用于 parseFloat()。
    • 这让我免去了一些头痛。为此+1。我不知道它会把数字变成字符串。
    • @Lukas 不是,如果做 parseFloat
    • 如果我申请 '2.00' 号码,这将返回 2
    • 这个方法是用来修正的,不是用来格式化的。例如:0.1 + 0.2 // 0.30000000000000004 所以我需要更正那个(0.1+0.2).round() // 0.3
    【解决方案4】:

    要返回一个数字,请添加另一层括号。保持清洁。

    var twoPlacedFloat = parseFloat((10.02745).toFixed(2));
    

    【讨论】:

    • 您的公式中是否缺少某些内容? var twoPlacedFloat = parseFloat(('2.00').toFixed(2)) 产生错误。
    • 抱歉,toFixed() 需要的是字符串变量而不是数字 - 现在已修复。但是 Rob 使用 Math.round 的答案在性能方面需要考虑。
    • 这应该是对 Vlada 答案的评论。
    【解决方案5】:

    如果您的目标是解析,并且您的输入可能是文字,那么您会认为 floattoFixed 不会提供,所以这里有两个简单的函数来提供这个:

    function parseFloat2Decimals(value) {
        return parseFloat(parseFloat(value).toFixed(2));
    }
    
    function parseFloat2Decimals(value,decimalPlaces) {
        return parseFloat(parseFloat(value).toFixed(decimalPlaces));
    }
    

    【讨论】:

    • 这不像预期的那样工作。 parseFloat(parseFloat('10.5').toFixed(2)) 返回10.5 预计10.50。还有parseFloat(parseFloat('10.50').toFixed(2))返回10.5
    • 这是一个浮点数,所以 10.5 等于 10.50
    • 我知道 10.5 == 10.50 但我需要打印到客户端 10.50 而不是 10.5
    【解决方案6】:

    来自 lodash 的 ceil 可能是最好的

    _.ceil("315.9250488",2) 
    _.ceil(315.9250488,2) 
    _.ceil(undefined,2)
    _.ceil(null,2)
    _.ceil("",2)
    

    也可以使用数字,而且很安全

    【讨论】:

    • 如果使用 lodash 的可行答案,我目前正在使用 underscore.js,目前 1.9.1 没有类似的功能。
    【解决方案7】:

    您可以使用 .toFixed() 来获取 2 位浮点值

    示例

    let newValue = parseFloat(9.990000).toFixed(2)
    
    //output
    9.99
    

    【讨论】:

      【解决方案8】:

      如果您不想四舍五入,请使用以下函数。

      function ConvertToDecimal(num) {
          num = num.toString(); //If it's not already a String
          num = num.slice(0, (num.indexOf(".")) + 3); //With 3 exposing the hundredths place
         alert('M : ' +  Number(num)); //If you need it back as a Number    
      }
      

      【讨论】:

      • 将其用作以下处理整数值以及 function ParseFloat(str, val = 2) { str = str.toString(); if (str.indexOf(".") > 0) { str = str.slice(0, (str.indexOf(".")) + val + 1); } //如果上述方法不起作用,以下也是一种替代方法 //str = str.match(/^-?\d+(?:\.\d{0,2})?/)[0];返回 !isNaN(str) ?数字(str):0; }
      【解决方案9】:

      我已经为我的案例尝试过这个,它会正常工作。

      var multiplied_value = parseFloat(given_quantity*given_price).toFixed(3);
      

      示例输出:

      9.007

      【讨论】:

        【解决方案10】:

        对于它的价值:十进制数是十进制数,您要么将其四舍五入为其他值,要么不四舍五入。在内部,它将根据浮点运算和处理的规则逼近一个小数。它在内部保持一个十进制数(浮点数,在 JS 中为双精度数),无论您想用多少位数显示它。

        要显示它,您可以通过字符串转换将显示的精度选择为您想要的任何值。演示是一个显示问题,而不是存储问题。

        【讨论】:

          【解决方案11】:

          @sd 简答:在 JS 中没有办法让 Number 数据类型值在小数点后带有尾随零。

          长答案: 它是 JavaScript 的 toFixedtoPrecision 函数的属性,用于返回字符串。原因是 Number 数据类型不能有像 a = 2.00 这样的值,它总是会删除小数点后的尾随零,这是 Number 数据类型的内置属性。因此,要在 JS 中实现上述目标,我们有 2 个选项

          1. 将数据用作字符串或
          2. 同意在 2.50 -> 2.5 的末尾使用大小写“0”截断值。

          【讨论】:

          • 说没有没有办法这样做是完全不诚实的。当然,冗长而复杂,但并非完全不可能 - 仅此堆栈就有大量可行的解决方案。
          【解决方案12】:

          您可以将价格存储为字符串

          你可以使用 数字(字符串)

          供您计算。

          例子

          Number("34.50") == 34.5
          

          还有

          Number("35.65") == 35.65
          

          如果您对 Number 函数感到满意,可以使用它。

          【讨论】:

          • 带逗号无效
          【解决方案13】:

          试试这个(见代码中的 cmets):

          function fixInteger(el) {
              // this is element's value selector, you should use your own
              value = $(el).val();
              if (value == '') {
                  value = 0;
              }
              newValue = parseInt(value);
              // if new value is Nan (when input is a string with no integers in it)
              if (isNaN(newValue)) {
                  value = 0;
                  newValue = parseInt(value);
              }
              // apply new value to element
              $(el).val(newValue);
          }
          
          function fixPrice(el) {
              // this is element's value selector, you should use your own
              value = $(el).val();
              if (value == '') {
                  value = 0;
              }
              newValue = parseFloat(value.replace(',', '.')).toFixed(2);
              // if new value is Nan (when input is a string with no integers in it)
              if (isNaN(newValue)) {
                  value = 0;
                  newValue = parseFloat(value).toFixed(2);
              }
              // apply new value to element
              $(el).val(newValue);
          }
          

          【讨论】:

            【解决方案14】:
            Solution for FormArray controllers 
            

            初始化 FormArray 表单生成器

              formInitilize() {
                this.Form = this._formBuilder.group({
                  formArray: this._formBuilder.array([this.createForm()])
                });
              }
            

            创建表单

              createForm() {
                return (this.Form = this._formBuilder.group({
                  convertodecimal: ['']
                }));
              }
            

            将表单值设置到表单控制器中

              setFormvalues() {
                this.Form.setControl('formArray', this._formBuilder.array([]));
                const control = <FormArray>this.resourceBalanceForm.controls['formArray'];
                this.ListArrayValues.forEach((x) => {
                  control.push(this.buildForm(x));
                });
              }
            
              private buildForm(x): FormGroup {
                const bindvalues= this._formBuilder.group({
                  convertodecimal: x.ArrayCollection1? parseFloat(x.ArrayCollection1[0].name).toFixed(2) : '' // Option for array collection
            // convertodecimal: x.number.toFixed(2)    --- option for two decimal value 
                });
            
                return bindvalues;
              }
            

            【讨论】:

              【解决方案15】:

              简单的 JavaScript,要浮动的字符串:

              var it_price = chief_double($("#ContentPlaceHolder1_txt_it_price").val());
              
              function chief_double(num){
                  var n = parseFloat(num);
                  if (isNaN(n)) {
                      return "0";
                  }
                  else {
                      return parseFloat(num);
                  }
              }
              

              【讨论】:

                【解决方案16】:

                我还有其他解决方案。

                您可以使用round() 来代替toFixed()

                var twoPlacedFloat = parseFloat(yourString).round(2)
                

                【讨论】:

                • @AustinHenley 我尝试使用 round() 但没有用。这可能就是人们拒绝投票的原因。他可能指的是 Math.round()
                • @Nathan 它需要在parseFloat() 之后内联使用,因为我已经通过@zsalzbank 更新了答案
                • 不,它不起作用。你可以试试 Math.round(parseFloat(yourString), 2);
                • 为什么不拒绝一个永远不会起作用的答案呢? js中的数字根本没有round()这样的方法。真正的问题是谁赞成这个。
                【解决方案17】:

                对我有用的解决方案如下

                parseFloat(value)
                

                【讨论】:

                  猜你喜欢
                  • 2016-10-19
                  • 2011-09-03
                  • 2018-10-06
                  • 1970-01-01
                  • 2011-02-02
                  • 2021-05-07
                  • 1970-01-01
                  • 2019-03-31
                  相关资源
                  最近更新 更多