Cắt số đến hai chữ số thập phân mà không làm tròn


194

Giả sử tôi có giá trị 15.7784514, tôi muốn hiển thị nó 15.77 mà không làm tròn số.

var num = parseFloat(15.7784514);
document.write(num.toFixed(1)+"<br />");
document.write(num.toFixed(2)+"<br />");
document.write(num.toFixed(3)+"<br />");
document.write(num.toFixed(10));

Kết quả trong -

15.8
15.78
15.778
15.7784514000 

Làm cách nào để hiển thị 15.77?


3
Tôi muốn hỏi, tại sao bạn không muốn làm tròn? Có vẻ như không chính xác cho dù ở đâu ...
Camilo Martin

38
Nó hữu ích khi hiển thị tiền tệ.
Richard Ye

@ mik01aj - Khi hiển thị tiền tệ, việc cắt bớt các giá trị được tính toán phổ biến hơn là làm tròn chúng. Ví dụ, hầu hết các hình thức thuế ở Hoa Kỳ cắt ngắn hơn là tính theo xu phân số được tính tròn. Trong trường hợp đó, giá trị cắt ngắn là giá trị chính xác.
Steven Byks

4
@CamiloMartin có một sự khác biệt rất lớn giữa khoản nợ 1,49 tỷ đô la và 1,0 tỷ đô la.
Broda Noel

3
Cũng có một sự khác biệt rất lớn giữa 1,49 tỷ và 1,50 tỷ đô la. Đó là 100 triệu đô la.
Liga

Câu trả lời:


226

Chuyển đổi số thành một chuỗi, khớp số đến vị trí thập phân thứ hai:

function calc(theform) {
    var num = theform.original.value, rounded = theform.rounded
    var with2Decimals = num.toString().match(/^-?\d+(?:\.\d{0,2})?/)[0]
    rounded.value = with2Decimals
}
<form onsubmit="return calc(this)">
Original number: <input name="original" type="text" onkeyup="calc(form)" onchange="calc(form)" />
<br />"Rounded" number: <input name="rounded" type="text" placeholder="readonly" readonly>
</form>

Các toFixedphương pháp thất bại trong một số trường hợp không giống toString, vì vậy phải rất cẩn thận với nó.


22
+1 Điều đó sẽ giải quyết vấn đề làm tròn số. Tuy nhiên, tôi vẫn đưa ra kết quả của việc sử dụng ở trên toFixed, vì vậy : (Math.floor(value * 100) / 100).toFixed(2). Như bạn có thể biết, những điều chính xác kỳ lạ có thể xảy ra với các giá trị dấu phẩy động (và ở phía bên kia của phổ, nếu số đó xảy ra 15, nghe có vẻ như OP muốn 15.00).
TJ Crowder

1
hehe, hoặc nếu bạn kết hợp cả hai:Number((15.7784514000*100).toString().match(/^\d+/)/100);
skobaljic

27
Math.floor (giá trị * 100) / 100 sẽ không hoạt động nếu value = 4,27 nghiêm túc, hãy thử nó.
Hippo tối

3
@DarkHippo Đó là vì 4.27 thực sự là 4.26999999999, Math.round nói chung là một giải pháp tốt hơn, mặc dù không phải là câu trả lời cho câu hỏi ban đầu. Thực tế đưa ra đầu ra là một chuỗi, điều này nên được thực hiện bằng cách sử dụng thao tác chuỗi thay vì một giải pháp số với tất cả các dấu phẩy động.
BJury

3
... điều đó không đúng. Chuyển đổi giữa các loại trong mọi trường hợp có vẻ như đường vòng và không an toàn. Trừ khi một lập trình viên thực sự tiên tiến sẽ lập luận rằng "tất cả các loại chỉ là luồng" hoặc một cái gì đó.
JackHasaPal

66

Cập nhật ngày 5 tháng 11 năm 2016

Câu trả lời mới, luôn chính xác

function toFixed(num, fixed) {
    var re = new RegExp('^-?\\d+(?:\.\\d{0,' + (fixed || -1) + '})?');
    return num.toString().match(re)[0];
}

toán học dấu phẩy động trong javascript sẽ luôn có các trường hợp cạnh, giải pháp trước đó sẽ chính xác hầu hết thời gian không đủ tốt. Có một số các giải pháp này như num.toPrecision, BigDecimal.js , và accounting.js . Tuy nhiên, tôi tin rằng chỉ cần phân tích cú pháp chuỗi sẽ đơn giản nhất và luôn chính xác.

Dựa trên bản cập nhật trên regex được viết tốt từ câu trả lời được chấp nhận bởi @Gumbo, chức năng toFixed mới này sẽ luôn hoạt động như mong đợi.


Câu trả lời cũ, không phải lúc nào cũng chính xác.

Cuộn chức năng toFixed của riêng bạn:

function toFixed(num, fixed) {
    fixed = fixed || 0;
    fixed = Math.pow(10, fixed);
    return Math.floor(num * fixed) / fixed;
}

7
toFixed (4.56, 2) = 4.55
khóc vào

2
Vì vậy, nhiều câu trả lời trong số này có phép nhân bên trong hàm Math.floor (). Điều này sẽ thất bại cho một số con số! Số học dấu phẩy động không chính xác và bạn cần sử dụng các phương pháp khác nhau.
Nico Westerdale

1
hàm toFixedCustom (num, fixed) {var re = new RegExp ('^ -? \\ d + (?: \. \\ d {0,' + (fixed || -1) + '})?'); if (num.toString (). match (re)) {return num.toString (). match (re) [0]; }}
Ryan Augustine

1
Câu trả lời được cập nhật sẽ thất bại đối với một số lượng lớn hoặc nhỏ đủ để javascript đại diện cho ký hiệu khoa học. toFixed(0.0000000052, 2)mang lại '5,2'. Điều này có thể được khắc phục bằng cách sử dụng return num.toFixed(fixed+1).match(re)[0];Thông báo tôi đang sử dụng toFixed với một vị trí thập phân phía trên mục tiêu để tránh làm tròn, sau đó chạy trận đấu regex của bạn
Netherdan

32

Thay vào đó, tôi đã chọn viết phần này để xóa phần còn lại bằng các chuỗi để tôi không phải xử lý các vấn đề toán học đi kèm với các con số:

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

Điều này sẽ cung cấp cho bạn "15,77" với num = 15,7784514;


5
Nếu bạn không buộc một số thập phân, bạn có thể muốn thêm một điều kiện trong trường hợp bạn gặp phải toàn bộ số. Như thế này: num = num.toString (); if (num.indexOf (".")> 0) {num = num.slice (0, (num.indexOf (".")) + 3)}; Số (num);
ベ ン ノ

1
thật tuyệt nếu nó có số thập phân nhưng nếu nó là số nguyên thì nó sẽ thất bại
Ruslan López

Nếu num là 0,00000052, thì sẽ sai khi nhận 5,2e
Vasanth

1
@Vasanth Nếu số là 0,00000052 thì nó trả về "0,00". Có lẽ câu trả lời đã được chỉnh sửa kể từ
Drenai

Vâng, nó thất bại trong các trường hợp cạnh
VPaul

18

Tháng 10 năm 2017

Giải pháp chung để cắt bớt (không làm tròn) một số thành chữ số thập phân thứ n và chuyển đổi nó thành một chuỗi có chính xác n chữ số thập phân, cho bất kỳ n≥0.

function toFixedTrunc(x, n) {
  const v = (typeof x === 'string' ? x : x.toString()).split('.');
  if (n <= 0) return v[0];
  let f = v[1] || '';
  if (f.length > n) return `${v[0]}.${f.substr(0,n)}`;
  while (f.length < n) f += '0';
  return `${v[0]}.${f}`
}

trong đó x có thể là một số (được chuyển thành chuỗi) hoặc chuỗi.

Dưới đây là một số thử nghiệm cho n = 2 (bao gồm cả thử nghiệm do OP yêu cầu):

0           => 0.00
0.01        => 0.01
0.5839      => 0.58
0.999       => 0.99
1.01        => 1.01
2           => 2.00
2.551       => 2.55
2.99999     => 2.99
4.27        => 4.27
15.7784514  => 15.77
123.5999    => 123.59
0.000000199 => 1.99 *

* Như đã đề cập trong ghi chú, đó là do chuyển đổi ngầm định javascript thành số mũ cho "1.99e-7" và đối với một số giá trị khác của n:

15.001097   => 15.0010 (n=4)
0.000003298 => 0.0000032 (n=7)
0.000003298257899 => 0.000003298257 (n=12)

2
toFixedTrunc(0.000000199, 2) // 1.99
Maharramoff

1
@ShamkhalMaharramov: nếu bạn mở bảng điều khiển phát triển và nhập 0,000000199, bạn sẽ nhận được gì? Bạn nhận được 1.99e-7. Ngoài ra, nếu bạn nhập 0,000000199.toString () bạn sẽ nhận được gì? Bạn nhận được "1.99e-7" Vì vậy, khi bạn chuyển 0,000000199 cho chức năng, nó sẽ kết thúc hoạt động trên "1.99e-7" chứ không phải "0,000000199" và "trả lại" chính xác "1.99". Xem ecma
SC1000

13

parseInt nhanh hơn Math.floor

function floorFigure(figure, decimals){
    if (!decimals) decimals = 2;
    var d = Math.pow(10,decimals);
    return (parseInt(figure*d)/d).toFixed(decimals);
};

floorFigure(123.5999)    =>   "123.59"
floorFigure(123.5999, 3) =>   "123.599"

2
nó thất bại với 1234567,89
Ruslan López

Bạn có thể xây dựng Lopez?
zardilior

3
floorHình (4.56, 2) = 4.55
khóc


6
num = 19.66752
f = num.toFixed(3).slice(0,-1)
alert(f)

Điều này sẽ trở lại 19,66


5
(4.9999) .toFixed (3) .slice (0, -1) trả về 5,00, kết quả dự kiến ​​là 4,99.
Bruno Lemos

1
Tôi khuyên bạn nên sử dụng một cái gì đó như .toFixed (6) .slice (0, -4) để thay thế.
Bruno Lemos

đó là hoàn hảo, trong trường hợp của tôi nó ổn. ví dụ: nếu tôi muốn chỉ có một số thập phân, hãy sử dụng num.toFixed (2) .slice (0, -1) (nếu num có 1.2356, nó sẽ trả về 1.2)
Esteban Perez

5

Những giải pháp này có tác dụng, nhưng với tôi có vẻ phức tạp không cần thiết. Cá nhân tôi thích sử dụng toán tử mô đun để có được phần còn lại của phép toán chia và loại bỏ điều đó. Giả sử rằng num = 15.7784514:

num-=num%.01;

Điều này tương đương với việc nói num = num - (num% .01).


Đó là Nijkokun thú vị, cảm ơn vì đã chỉ ra. Tôi chưa bao giờ gặp vấn đề khi sử dụng kỹ thuật này, nhưng rõ ràng tôi nên xem xét kỹ hơn những trường hợp như thế này. Để thay thế, bạn có thể sử dụng ((num * = 100) - (num% 1)) / 100 để giải quyết vấn đề này. Ưu tiên trong trường hợp của tôi là tốc độ thực thi vì khối lượng tính toán tôi đang áp dụng điều này và đây là cách nhanh nhất để đạt được điều này mà tôi đã tìm thấy.
jtrick

1
Vấn đề là tránh các đối tượng và chức năng tra cứu và chuyển đổi cần thiết trong các giải pháp khác được cung cấp. Cảm ơn vì bạn đã phản hồi!
jtrick

1
cũng thất bại với những tiêu cực như -5
Ruslan López

Tôi cũng quan tâm đến việc làm tròn nhanh, làm thế nào để bạn thực hiện mã này làm 1 số thập phân?
thednp

5

Các câu trả lời ở đây không giúp tôi, nó cứ làm tròn hoặc cho tôi số thập phân sai.

giải pháp của tôi chuyển đổi số thập phân của bạn thành một chuỗi, trích xuất các ký tự và sau đó trả về toàn bộ dưới dạng một số.

function Dec2(num) {
  num = String(num);
  if(num.indexOf('.') !== -1) {
    var numarr = num.split(".");
    if (numarr.length == 1) {
      return Number(num);
    }
    else {
      return Number(numarr[0]+"."+numarr[1].charAt(0)+numarr[1].charAt(1));
    }
  }
  else {
    return Number(num);
  }  
}

Dec2(99); // 99
Dec2(99.9999999); // 99.99
Dec2(99.35154); // 99.35
Dec2(99.8); // 99.8
Dec2(10265.985475); // 10265.98

Dec2 (99) sẽ trả lại 99,00
VPaul

5

Phiên bản của tôi cho số dương:

function toFixed_norounding(n,p)
{
    var result = n.toFixed(p);
    return result <= n ? result: (result - Math.pow(0.1,p)).toFixed(p);
}

Nhanh, đẹp, rõ ràng. (phiên bản cho số dương)


cần không làm tròn cho các giá trị float (ví dụ: tiền), chỉ với 1 số thập phân. Chức năng trên phải là "câu trả lời" của chủ đề này, thật tuyệt vời, hoạt động như một cơ duyên. chúc mừng tác giả & cảm ơn. :)))
Adrian Tanase

Thất bại cho giá trị âm. -0.7752. Kiểm tra nó toFixed_norounding(-0.7752,2)trở lại -0.78thay vì-0.77
Ling Loeng

4

Các mã sau hoạt động rất tốt cho tôi:

num.toString().match(/.\*\\..{0,2}|.\*/)[0];

Tôi sẽ thêm dấu trừ tùy chọn để làm cho nó hoàn hảo -?;)
Ruslan López

3

Tôi đã sửa bằng cách sử dụng cách đơn giản sau-

var num = 15.7784514;
Math.floor(num*100)/100;

Kết quả sẽ là 15,77


Nó không hoạt động với các giá trị âm: -15.7784514trả về-15.78
Clément Baconnier 6/12/18

3

Chỉ cần cắt bớt các chữ số:

function truncDigits(inputNumber, digits) {
  const fact = 10 ** digits;
  return Math.floor(inputNumber * fact) / fact;
}

3

Một giải pháp đơn dòng khác:

number = Math.trunc(number*100)/100

Tôi đã sử dụng 100 vì bạn muốn cắt bớt chữ số thứ hai, nhưng một giải pháp linh hoạt hơn sẽ là:

number = Math.trunc(number*Math.pow(10, digits))/Math.pow(10, digits)

trong đó chữ số là số chữ số thập phân cần giữ.

Xem thông số kỹ thuật Math.trunc để biết chi tiết và tương thích trình duyệt.


1
Đây là câu trả lời tốt nhất nếu bạn không phải hỗ trợ IE11.
TJ.

2

Của bạn đây. Một câu trả lời cho thấy một cách khác để giải quyết vấn đề:

// For the sake of simplicity, here is a complete function:
function truncate(numToBeTruncated, numOfDecimals) {
    var theNumber = numToBeTruncated.toString();
    var pointIndex = theNumber.indexOf('.');
    return +(theNumber.slice(0, pointIndex > -1 ? ++numOfDecimals + pointIndex : undefined));
}

Lưu ý việc sử dụng + trước biểu thức cuối cùng. Đó là để chuyển đổi chuỗi bị cắt, cắt của chúng tôi trở lại loại số.

Hy vọng nó giúp!


1
Tôi thích sự đơn giản của phương pháp này và tôi cảm thấy rằng tất cả các giải pháp tránh sử dụng Toán học, phù hợp hơn để giải quyết vấn đề này. Vì vậy, việc sử dụng lát () vv, là cách chính xác về phía trước. Ưu điểm duy nhất của phương pháp của tôi là nó sẽ xử lý các số được truyền trong đó là các chuỗi [được bao quanh bởi dấu ngoặc kép [đơn / đôi]]. Vì một số lý do, hàm trên đã gây ra lỗi trong FF, khi tôi đã làm: console.log ('truncate ("0.85156", 2)', truncate ("0.85156", 2));
Charles Robertson

2

cắt ngắn mà không có số không

function toTrunc(value,n){  
    return Math.floor(value*Math.pow(10,n))/(Math.pow(10,n));
}

hoặc là

function toTrunc(value,n){
    x=(value.toString()+".0").split(".");
    return parseFloat(x[0]+"."+x[1].substr(0,n));
}

kiểm tra:

toTrunc(17.4532,2)  //17.45
toTrunc(177.4532,1) //177.4
toTrunc(1.4532,1)   //1.4
toTrunc(.4,2)       //0.4

cắt ngắn với số không

function toTruncFixed(value,n){
    return toTrunc(value,n).toFixed(n);
}

kiểm tra:

toTrunc(17.4532,2)  //17.45
toTrunc(177.4532,1) //177.4
toTrunc(1.4532,1)   //1.4
toTrunc(.4,2)       //0.40

2

Điều này làm việc tốt cho tôi. Tôi hy vọng nó sẽ khắc phục vấn đề của bạn quá.

function toFixedNumber(number) {
    const spitedValues = String(number.toLocaleString()).split('.');
    let decimalValue = spitedValues.length > 1 ? spitedValues[1] : '';
    decimalValue = decimalValue.concat('00').substr(0,2);

    return '$'+spitedValues[0] + '.' + decimalValue;
}

// 5.56789      ---->  $5.56
// 0.342        ---->  $0.34
// -10.3484534  ---->  $-10.34 
// 600          ---->  $600.00

function convertNumber(){
  var result = toFixedNumber(document.getElementById("valueText").value);
  document.getElementById("resultText").value = result;
}


function toFixedNumber(number) {
        const spitedValues = String(number.toLocaleString()).split('.');
        let decimalValue = spitedValues.length > 1 ? spitedValues[1] : '';
        decimalValue = decimalValue.concat('00').substr(0,2);

        return '$'+spitedValues[0] + '.' + decimalValue;
}
<div>
  <input type="text" id="valueText" placeholder="Input value here..">
  <br>
  <button onclick="convertNumber()" >Convert</button>
  <br><hr>
  <input type="text" id="resultText" placeholder="result" readonly="true">
</div>


2

Một cách dễ dàng để làm điều đó là tiếp theo nhưng cần thiết để đảm bảo rằng tham số lượng được đưa ra dưới dạng chuỗi.

function truncate(amountAsString, decimals = 2){
  var dotIndex = amountAsString.indexOf('.');
  var toTruncate = dotIndex !== -1  && ( amountAsString.length > dotIndex + decimals + 1);
  var approach = Math.pow(10, decimals);
  var amountToTruncate = toTruncate ? amountAsString.slice(0, dotIndex + decimals +1) : amountAsString;  
  return toTruncate
    ?  Math.floor(parseFloat(amountToTruncate) * approach ) / approach
    :  parseFloat(amountAsString);

}

console.log(truncate("7.99999")); //OUTPUT ==> 7.99
console.log(truncate("7.99999", 3)); //OUTPUT ==> 7.999
console.log(truncate("12.799999999999999")); //OUTPUT ==> 7.99

2

function formatLimitDecimals(value, decimals) {
  value = value.toString().split('.')

  if (value.length === 2) {
    return Number([value[0], value[1].slice(0, decimals)].join('.'))
  } else {
    return Number(value[0]);
  }
}

console.log(formatLimitDecimals(4.156, 2)); // 4.15
console.log(formatLimitDecimals(4.156, 8)); // 4.156
console.log(formatLimitDecimals(4.156, 0)); // 4


1

Tôi đã sử dụng (num-0.05).toFixed(1)để có được số thập phân thứ hai trôi nổi.


1

Giải pháp của tôi trong bản thảo (có thể dễ dàng chuyển sang JS):

/**
 * Returns the price with correct precision as a string
 *
 * @param   price The price in decimal to be formatted.
 * @param   decimalPlaces The number of decimal places to use
 * @return  string The price in Decimal formatting.
 */
type toDecimal = (price: number, decimalPlaces?: number) => string;
const toDecimalOdds: toDecimal = (
  price: number,
  decimalPlaces: number = 2,
): string => {
  const priceString: string = price.toString();
  const pointIndex: number = priceString.indexOf('.');

  // Return the integer part if decimalPlaces is 0
  if (decimalPlaces === 0) {
    return priceString.substr(0, pointIndex);
  }

  // Return value with 0s appended after decimal if the price is an integer
  if (pointIndex === -1) {
    const padZeroString: string = '0'.repeat(decimalPlaces);

    return `${priceString}.${padZeroString}`;
  }

  // If numbers after decimal are less than decimalPlaces, append with 0s
  const padZeroLen: number = priceString.length - pointIndex - 1;
  if (padZeroLen > 0 && padZeroLen < decimalPlaces) {
    const padZeroString: string = '0'.repeat(padZeroLen);

    return `${priceString}${padZeroString}`;
  }

  return priceString.substr(0, pointIndex + decimalPlaces + 1);
};

Các trường hợp thử nghiệm:

  expect(filters.toDecimalOdds(3.14159)).toBe('3.14');
  expect(filters.toDecimalOdds(3.14159, 2)).toBe('3.14');
  expect(filters.toDecimalOdds(3.14159, 0)).toBe('3');
  expect(filters.toDecimalOdds(3.14159, 10)).toBe('3.1415900000');
  expect(filters.toDecimalOdds(8.2)).toBe('8.20');

Có cải tiến gì không?


0

Cuộn toFixedchức năng của riêng bạn : cho các giá trị tích cực Math.floorhoạt động tốt.

function toFixed(num, fixed) {
    fixed = fixed || 0;
    fixed = Math.pow(10, fixed);
    return Math.floor(num * fixed) / fixed;
}

Đối với các giá trị âm Math.floorlà vòng của các giá trị. Vì vậy, bạn có thể sử dụngMath.ceil thay thế.

Thí dụ,

Math.ceil(-15.778665 * 10000) / 10000 = -15.7786
Math.floor(-15.778665 * 10000) / 10000 = -15.7787 // wrong.

5
Vì vậy, nhiều câu trả lời trong số này có phép nhân bên trong hàm Math.floor (). Điều này sẽ thất bại cho một số con số! Số học dấu phẩy động không chính xác và bạn cần sử dụng các phương pháp khác nhau.
Nico Westerdale

0

Giải pháp thứ hai của Gumbo, với biểu thức chính quy, không hoạt động nhưng chậm vì biểu thức chính quy. Giải pháp đầu tiên của Gumbo thất bại trong một số tình huống do sự thiếu chính xác về số lượng dấu phẩy động. Xem JSFiddle để trình diễn và điểm chuẩn. Giải pháp thứ hai mất khoảng 1636 nano giây mỗi cuộc gọi trên hệ thống hiện tại của tôi, CPU Intel Core i5-2500 tốc độ 3,30 GHz.

Giải pháp tôi đã viết liên quan đến việc thêm một khoản bồi thường nhỏ để xử lý sự thiếu chính xác của dấu phẩy động. Về cơ bản là tức thời, tức là theo thứ tự nano giây. Tôi đã chạy 2 nano giây mỗi cuộc gọi nhưng bộ định thời JavaScript không chính xác hoặc chi tiết. Đây là Fiddle JS và mã.

function toFixedWithoutRounding (value, precision)
{
    var factorError = Math.pow(10, 14);
    var factorTruncate = Math.pow(10, 14 - precision);
    var factorDecimal = Math.pow(10, precision);
    return Math.floor(Math.floor(value * factorError + 1) / factorTruncate) / factorDecimal;
}

var values = [1.1299999999, 1.13, 1.139999999, 1.14, 1.14000000001, 1.13 * 100];

for (var i = 0; i < values.length; i++)
{
    var value = values[i];
    console.log(value + " --> " + toFixedWithoutRounding(value, 2));
}

for (var i = 0; i < values.length; i++)
{
    var value = values[i];
    console.log(value + " --> " + toFixedWithoutRounding(value, 4));
}

console.log("type of result is " + typeof toFixedWithoutRounding(1.13 * 100 / 100, 2));

// Benchmark
var value = 1.13 * 100;
var startTime = new Date();
var numRun = 1000000;
var nanosecondsPerMilliseconds = 1000000;

for (var run = 0; run < numRun; run++)
    toFixedWithoutRounding(value, 2);

var endTime = new Date();
var timeDiffNs = nanosecondsPerMilliseconds * (endTime - startTime);
var timePerCallNs = timeDiffNs / numRun;
console.log("Time per call (nanoseconds): " + timePerCallNs);

0

Dựa trên câu trả lời của David D :

function NumberFormat(num,n) {
  var num = (arguments[0] != null) ? arguments[0] : 0;
  var n = (arguments[1] != null) ? arguments[1] : 2;
  if(num > 0){
    num = String(num);
    if(num.indexOf('.') !== -1) {
      var numarr = num.split(".");
      if (numarr.length > 1) {
        if(n > 0){
          var temp = numarr[0] + ".";
          for(var i = 0; i < n; i++){
            if(i < numarr[1].length){
              temp += numarr[1].charAt(i);
            }
          }
          num = Number(temp);
        }
      }
    }
  }
  return Number(num);
}

console.log('NumberFormat(123.85,2)',NumberFormat(123.85,2));
console.log('NumberFormat(123.851,2)',NumberFormat(123.851,2));
console.log('NumberFormat(0.85,2)',NumberFormat(0.85,2));
console.log('NumberFormat(0.851,2)',NumberFormat(0.851,2));
console.log('NumberFormat(0.85156,2)',NumberFormat(0.85156,2));
console.log('NumberFormat(0.85156,4)',NumberFormat(0.85156,4));
console.log('NumberFormat(0.85156,8)',NumberFormat(0.85156,8));
console.log('NumberFormat(".85156",2)',NumberFormat(".85156",2));
console.log('NumberFormat("0.85156",2)',NumberFormat("0.85156",2));
console.log('NumberFormat("1005.85156",2)',NumberFormat("1005.85156",2));
console.log('NumberFormat("0",2)',NumberFormat("0",2));
console.log('NumberFormat("",2)',NumberFormat("",2));
console.log('NumberFormat(85156,8)',NumberFormat(85156,8));
console.log('NumberFormat("85156",2)',NumberFormat("85156",2));
console.log('NumberFormat("85156.",2)',NumberFormat("85156.",2));

// NumberFormat(123.85,2) 123.85
// NumberFormat(123.851,2) 123.85
// NumberFormat(0.85,2) 0.85
// NumberFormat(0.851,2) 0.85
// NumberFormat(0.85156,2) 0.85
// NumberFormat(0.85156,4) 0.8515
// NumberFormat(0.85156,8) 0.85156
// NumberFormat(".85156",2) 0.85
// NumberFormat("0.85156",2) 0.85
// NumberFormat("1005.85156",2) 1005.85
// NumberFormat("0",2) 0
// NumberFormat("",2) 0
// NumberFormat(85156,8) 85156
// NumberFormat("85156",2) 85156
// NumberFormat("85156.",2) 85156


0

Đã có một số câu trả lời phù hợp với biểu thức chính quy và tính toán số học, bạn cũng có thể thử điều này

function myFunction() {
    var str = 12.234556; 
    str = str.toString().split('.');
    var res = str[1].slice(0, 2);
    document.getElementById("demo").innerHTML = str[0]+'.'+res;
}

// output: 12.23

0

Đây là những gì đã làm với chuỗi

export function withoutRange(number) {
  const str = String(number);
  const dotPosition = str.indexOf('.');
  if (dotPosition > 0) {
    const length = str.substring().length;
    const end = length > 3 ? 3 : length;
    return str.substring(0, dotPosition + end);
  }
  return str;
}

0

Tất cả những câu trả lời này có vẻ hơi phức tạp. Tôi sẽ chỉ trừ 0,5 từ số của bạn và sử dụng toFixed ().


Ý bạn là 0,005?
Luân Nguyễn

0

Giải pháp hiệu quả nhất (cho 2 chữ số phân số) là trừ 0,005 trước khi gọi toFixed()

function toFixed2( num ) { return (num-0.005).toFixed(2) }

Các số âm cũng sẽ được làm tròn xuống (cách xa 0). OP đã không nói gì về số âm.


0

Tôi biết đã có một vài ví dụ hoạt động, nhưng tôi nghĩ rằng đáng để đề xuất tương đương String.toFixed của tôi, một số có thể thấy nó hữu ích.

Đó là sự thay thế hoàn hảo của tôi, không làm tròn số, chỉ cắt bớt nó hoặc thêm số không theo độ chính xác đã cho. Đối với số lượng dài thêm, nó sử dụng làm tròn tích hợp JS khi độ chính xác là dài. Hàm hoạt động cho tất cả các số có vấn đề tôi đã tìm thấy trên ngăn xếp.

function toFixedFixed(value, precision = 0) {
    let stringValue = isNaN(+value) ? '0' : String(+value);

    if (stringValue.indexOf('e') > -1 || stringValue === 'Infinity' || stringValue === '-Infinity') {
        throw new Error('To large number to be processed');
    }

    let [ beforePoint, afterPoint ] = stringValue.indexOf('.') > -1 ? stringValue.split('.') : [ stringValue, ''];

    // Force automatic rounding for some long real numbers that ends with 99X, by converting it to string, cutting off last digit, then adding extra nines and casting it on number again
    // e.g. 2.0199999999999996: +('2.019999999999999' + '9999') will give 2.02
    if (stringValue.length >= 17 && afterPoint.length > 2 && +afterPoint.substr(afterPoint.length - 3) > 995) {
        stringValue = String(+(stringValue.substr(0, afterPoint.length - 1) + '9'.repeat(stringValue.split('.').shift().length + 4)));
        [ beforePoint, afterPoint ] = String(stringValue).indexOf('.') > -1 ? stringValue.split('.') : [ stringValue, ''];
    }

    if (precision === 0) {
        return beforePoint;
    } else if (afterPoint.length > precision) {
        return `${beforePoint}.${afterPoint.substr(0, precision)}`;
    } else {
        return `${beforePoint}.${afterPoint}${'0'.repeat(precision - afterPoint.length)}`;
    }
}

Hãy nhớ rằng độ chính xác có thể không được xử lý đúng đối với các số có độ dài từ 18 trở lên, ví dụ Chrome 64 bit sẽ làm tròn nó hoặc thêm "e +" / "e-" để giữ độ dài của số ở mức 18.

Nếu bạn muốn thực hiện các thao tác trên các số thực, an toàn hơn là nhân nó với số Math.sqrt(10, precision)đầu tiên, thực hiện các phép tính, sau đó kết quả bằng cách nhân giá trị của số nhân.

Thí dụ:

0.06 + 0.010.06999999999999999, và mọi chức năng định dạng không làm tròn sẽ cắt 0.06chính xác nó 2.

Nhưng nếu bạn thực hiện cùng một thao tác với số nhân & bộ chia:, (0.06 * 100 + 0.01 * 100) / 100bạn sẽ nhận được 0.07.

Đó là lý do tại sao việc sử dụng số nhân / chia như vậy rất quan trọng khi xử lý các số thực trong javascript, đặc biệt là khi bạn đang tính tiền ...

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.