Làm thế nào để phân tích float với hai chữ số thập phân trong javascript?


411

Tôi có mã sau đây. Tôi muốn có nó sao cho nếu price_result bằng một số nguyên, giả sử là 10, thì tôi muốn thêm hai chữ số thập phân. Vậy 10 sẽ là 10,00. Hoặc nếu nó bằng 10,6 sẽ là 10,60. Không chắc làm việc này như thế nào.

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

Câu trả lời:


915

Bạn có thể sử dụng toFixed () để làm điều đó

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

1
rất vui khi được giúp đỡ và tiếp tục làm tốt công việc - "học một điều mới mỗi ngày"
Mahesh Velaga

3
toFixed là khá lỗi. Ngoài ra, đây là một liên kết tốt hơn so với w3schools developer.mozilla.org/en-US/docs/JavaScript/Reference/
Kẻ

125
nhưng toFixed () trả về số dưới dạng chuỗi, nếu bạn sẽ so sánh các số, bạn cần sử dụng lại parseFloat.
Pedro Muniz

19
Sử dụng var twoPlacedFloat = + parseFloat(yourString).toFixed(2)để chuyển đổi sang phao
Jose Rui Santos

13
Thêm parens để lấy số thay vì chuỗi: parseFloat ((yourString) .toFixed (2));
pvanallen

50

Khi bạn sử dụng toFixed, nó luôn trả về giá trị dưới dạng chuỗi. Điều này đôi khi làm phức tạp mã. Để tránh điều đó, bạn có thể tạo một phương thức thay thế cho Số.

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

Và sử dụng:

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

hoặc đơn giản:

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

Tôi đã viết một chương trình giỏ hàng và thử sử dụng các phương thức toFixed () và round () được kết nối với phương thức parseFloat (). Cả hai phương thức này đều không hoạt động với parseFloat ().
Chris22

Điều này tiết kiệm cho tôi một số đau đầu. +1 chỉ cho điều đó. Tôi không biết nó sẽ biến số thành chuỗi.
Lukas

@Lukas Không, nếu làm parseFloat
Vlada

Điều này trả về 2 nếu tôi áp dụng cho số '2,00'
Saurin Dashadia

Phương pháp này là để sửa chữa, không phải để định dạng. Ví dụ: 0.1 + 0.2 // 0.30000000000000004vì vậy tôi cần chỉnh sửa cho điều đó(0.1+0.2).round() // 0.3
Vlada

47

Nếu bạn cần hiệu suất (như trong trò chơi):

Math.round(number * 100) / 100

Nó nhanh gấp 100 lần parseFloat (number.toFixed (2))

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


5
Với công thức trên '2,00' trả về 2. nhưng tôi muốn nó là 2,00.
Saurin Dashadia

5
Bạn có thể có nó trong cả hai cách. Nếu bạn muốn đầu ra là một số thay vì một chuỗi, thì bạn sẽ không nhận được các số 0 ở cuối. Vì vậy, bạn có thể sử dụng chuyển đổi ở trên thành một chuỗi: var haiPlacesFloat = (Math.round (2.002745 * 100) / 100) .toFixed (2);
pvanallen

3
Bạn có tăng tốc độ nếu tôi thay đổi 100 đến 200 không?
alashow

Nếu số lượng các phép toán dấu phẩy động giữ nguyên thì tốc độ sẽ như nhau, vì vậy không
Rob Boerman

Tại sao không đơn giản number * 1là tôi thiếu một cái gì đó có thể 🤔?
ncubica

11

Để trả về một số, thêm một lớp dấu ngoặc đơn. Giữ nó sạch sẽ.

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

2
Bạn đang thiếu một cái gì đó trong công thức của bạn? var twoPlacedFloat = parseFloat(('2.00').toFixed(2))tạo ra lỗi.
Saurin Dashadia

xin lỗi, có một biến chuỗi thay vì một số, mà toFixed () cần - đã sửa bây giờ. Nhưng câu trả lời của Rob khi sử dụng Math.round là điều cần xem xét về mặt hiệu suất.
pvanallen

Đây phải là một nhận xét cho câu trả lời của Vlada.
Rodrirokr

5

Nếu mục tiêu của bạn là phân tích cú pháp và đầu vào của bạn có thể bằng chữ, thì bạn sẽ mong đợi floattoFixedsẽ không cung cấp điều đó, vì vậy đây là hai chức năng đơn giản để cung cấp điều này:

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

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

2
Điều đó không làm việc như gián điệp. parseFloat(parseFloat('10.5').toFixed(2))trở về 10.5gián điệp 10.50. Cũng parseFloat(parseFloat('10.50').toFixed(2))quay trở lại10.5
MTK

Mặc dù đó là một cái phao, vì vậy 10,5 bằng 10,50
Savage

Tôi biết rằng 10,5 == 10,50 nhưng tôi cần in cho khách hàng 10,50 chứ không phải 10,5
MTK

2

trần từ lodash có lẽ là tốt nhất

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

cũng sẽ hoạt động với một số và nó an toàn


1
Câu trả lời khả thi nếu sử dụng lodash, tôi hiện đang sử dụng underscore.js và hiện tại 1.9.1 không có chức năng tương tự.
Rodrirokr

1

@sd Trả lời ngắn gọn: Không có cách nào trong JS có giá trị kiểu dữ liệu Số với các số 0 ở sau một số thập phân.

Câu trả lời dài: Thuộc tính toFixedhoặc toPrecisionchức năng của JavaScript, để trả về Chuỗi. Lý do cho điều này là kiểu dữ liệu Số không thể có giá trị như a = 2,00, nó sẽ luôn loại bỏ các số 0 sau dấu thập phân, Đây là thuộc tính sẵn có của Số kiểu dữ liệu. Vì vậy, để đạt được những điều trên trong JS, chúng ta có 2 tùy chọn

  1. Sử dụng dữ liệu dưới dạng chuỗi hoặc
  2. Đồng ý có giá trị cắt ngắn với trường hợp '0' ở cuối ex 2.50 -> 2.5. Số không thể có số 0 ở sau số thập phân

0

Vui lòng sử dụng chức năng dưới đây nếu bạn không muốn làm tròn số.

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    
}

0

Đối với giá trị của nó: Số thập phân, là số thập phân, bạn có thể làm tròn nó thành một số giá trị khác hay không. Trong nội bộ, nó sẽ xấp xỉ một phần thập phân theo quy tắc số học dấu phẩy động và xử lý. Nó vẫn là một số thập phân (dấu phẩy động, trong JS gấp đôi) bên trong, bất kể bạn muốn hiển thị bao nhiêu chữ số.

Để hiển thị nó để hiển thị, bạn có thể chọn độ chính xác của màn hình theo bất cứ điều gì bạn muốn bằng cách chuyển đổi chuỗi. Trình bày là một vấn đề hiển thị, không phải là một điều lưu trữ.


0

Bạn có thể sử dụng .toFixed () để tạo giá trị float 2 chữ số

Exampale

let newValue = parseFloat(9.990000).toFixed(2)

//output
9.99

-1

Hãy thử điều này (xem ý kiến ​​trong mã):

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);
}

-1

JavaScript đơn giản, chuỗi để nổi:

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);
    }
}


-2
Solution for FormArray controllers 

Khởi tạo Trình tạo biểu mẫu FormArray

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

Tạo biểu mẫu

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

Đặt giá trị biểu mẫu vào Trình điều khiển biểu mẫu

  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;
  }

-3

Tôi đã có giải pháp khác.

Bạn có thể sử dụng round()để làm điều đó thay vào đótoFixed()

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

7
@AustinHenley Tôi đã thử sử dụng round () và nó không hoạt động. Đó có lẽ là lý do tại sao mọi người đang bỏ phiếu. Anh ta có thể đang đề cập đến Math.round ()
Nathan

@Nathan nó cần được sử dụng nội tuyến, sau khi parseFloat()tôi cập nhật câu trả lời của @zsalzbank
Alastair

3
Không, nó không hoạt động. Bạn có thể thử Math.round (parseFloat (yourString), 2);
Augie Gardner

1
Tại sao không downvote một câu trả lời sẽ không bao giờ làm việc? Đơn giản là không có phương pháp nào như round()trên các số trong js. Câu hỏi thực sự là ai đã ủng hộ điều này.
meandre
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.