sách gpt4 ăn đã đi

Giải pháp cho vấn đề sai về Javascript toFixed và math.round(giải quyết vấn đề sai về JavaScript toFixed và math.round)

In lại Tác giả: trợ lý lỗi Thời gian cập nhật: 26-10-2023 21:07:41 25 4
mua khóa gpt4 giày nike



Có cách nào để làm tròn đúng số 35.855 thành hai chữ số thập phân trong javascript không? Thử làm tròn nó có các giải pháp khác nhau dựa trên môi trường (35.85 trong Chrome, 35.86 trong IE9).

Có cách nào để làm tròn chính xác số 35,855 đến hai chữ số thập phân trong tập lệnh Java không? Nó có các giải pháp khác nhau tùy thuộc vào môi trường (35,85 cho Chrome, 35,86 cho IE9).


Tôi đang tìm giải pháp mà javascript làm tròn sai số thập phân (làm tròn giá trị .5 xuống thay vì làm tròn lên) và chưa tìm ra giải pháp nào bao gồm tất cả các giá trị mà tôi có. Chúng hoạt động khác nhau trong các môi trường/trình duyệt khác nhau.

Tôi đang tìm giải pháp cho vấn đề trong đó javascript làm tròn số thập phân không chính xác (làm tròn giá trị 0,5 xuống thay vì lên), nhưng chưa tìm thấy giải pháp bao gồm tất cả các giá trị của tôi. Chúng hoạt động khác nhau trong các môi trường/trình duyệt khác nhau.




console.log(Math.round(35.855*100)/100);
// kết quả: 35.85 (IE9 : 35.86, Chrome: 35.85 ???)
console.log((35.855).toFixed(2));
// kết quả: 35.85




Thêm câu trả lời

@Pointy Nhưng IE9 có hành vi như mong đợi còn Chrome lại có hành vi không như mong đợi.

@Pointty, nhưng IE9 có hành vi được mong đợi và Chrome có hành vi không mong muốn.

Câu trả lời này có giải đáp được thắc mắc của bạn không? Toán học dấu phẩy động có bị hỏng không?

Điều này có trả lời câu hỏi của bạn không? Có vấn đề với phép toán dấu phẩy động?

Không bao giờ sử dụng toán dấu phẩy động cho tiền tệ. Sử dụng toán số nguyên và sử dụng giá trị đồng xu nhỏ nhất làm cơ sở.

Không bao giờ sử dụng số học dấu phẩy động với tiền tệ. Sử dụng phép toán số nguyên và sử dụng giá trị đồng xu nhỏ nhất làm cơ sở.

Nếu bạn thực sự sử dụng toán học dấu phẩy động để kiếm tiền, vâng, tôi thực sự khuyên bạn nên thiết kế lại nó. Điều đó thực sự khủng khiếp và có thể trở nên rất tốn kém. Bạn có thể bị kiện, vì ngay cả $0,1 + $0,2 cũng trả về giá trị sai. Hãy thử 0,1 + 0,2 == 0,3

Nếu bạn thực sự quan tâm đến việc kiếm tiền, vâng, tôi thực sự khuyên bạn nên thiết kế lại nó. Điều đó thực sự đáng sợ và có thể rất tốn kém. Bạn có thể bị kiện vì thậm chí $0,1 + $0,2 cũng trả về giá trị sai. Hãy thử 0,1 + 0,2 == 0,3

@SercanSametSavran mọi trang web tài chính mà tôi đã làm việc trong hơn 20 năm qua đều sử dụng thứ gì đó như Java "BigDecimal" (toán học dấu phẩy cố định), và các hệ thống như vậy đã trở thành tiêu chuẩn có từ những năm 1960 với phần cứng toán học BCD của máy chủ IBM. Bạn không thể, không thể sử dụng dấu phẩy động nhị phân cho "toán học tiền tệ". Đó chỉ đơn giản là quy luật của cuộc sống.

@SercanSametSavran Mọi trang web tài chính mà tôi đã làm việc trong hơn 20 năm qua đều sử dụng một cái gì đó như Java "BigDecimal" (toán điểm cố định), một hệ thống đã trở thành cố định trên phần cứng toán học BCD máy tính lớn của IBM kể từ tiêu chuẩn những năm 1960. Bạn không thể, không thể sử dụng dấu phẩy động nhị phân cho "toán tiền". Đó chỉ là một quy luật của cuộc sống.

Khuyến nghị câu trả lời tuyệt vời

Làm tròn 1 ký tự sau phần thập phân:

Làm tròn đến 1 ký tự sau phần thập phân:




const round = (số, chữ số = 2) => {
const str = num.toString(), idx = str.indexOf('.');
nếu (idx < 0) trả về số;
const left = str[idx + 1 + số]; // làm tròn ký tự này
nếu (!left) trả về số;
trả về parseFloat(str.slice(0, idx + 1 + số)) +
(trái >= 5) * (str[0] === '-' ? -1 : 1) / 10 ** chữ số;
}
[35,855, 35,8549999, [-35,8549999, 3], 35,895, 35,8, 35].forEach(số =>
console.log(JSON.stringify(số), '->', round(...[].concat(số))));




Và một chuẩn mực:

và một điểm chuẩn:


Chu kỳ: 1000000 / Chrome/117
-------------------------------------------------- ----------
Alexander lát cắt 151/phút 1.0x 163 166 159 151 169
Sercan Samet Savran 845/phút 5,6x 846 845 846 851 859
-------------------------------------------------- ----------
https://github.com/silentmantra/benchmark









Giải pháp của tôi chỉ là thêm cùng một chữ số vào cuối số (nếu có nhiều hơn 1 chữ số) để buộc số trước đó phải làm tròn đúng cách.

Giải pháp của tôi là thêm cùng một chữ số vào cuối số (nếu có nhiều hơn 1 chữ số) để buộc số trước đó phải được làm tròn chính xác.


hàm roundToTwoDecimal(myNumber){
hãy để myStrNumber = myNumber.toString();
// kiểm tra số của chúng ta có số thập phân hay không và có đủ số thập phân hay không
nếu(myStrNumber.split(".").length > 1 && myStrNumber.split(".")[1].length > 2){
// nhân đôi số thập phân cuối cùng ví dụ 35,855 bây giờ = 35,8555 và phân tích ngược lại thành số thực
myStrNumber += myStrNumber.substring(myStrNumber.length-1);
myNumber = parsFloat(myStrNumber);
} // không cần thêm dấu thập phân nào ở đây.
// trả về myNumber*100 = 3585.55 ---round--> 3586 / 100 = 35.86
trả về Math.round(myNumber*100)/100;
}

Thêm câu trả lời

Tuyệt đấy. Bạn có nghĩ là làm việc với regex sẽ hiệu quả hơn trong trường hợp đó không?

Hoan hô. Bạn có nghĩ rằng sử dụng biểu thức chính quy sẽ tốt hơn trong trường hợp này không?

@SercanSametSavran tôi muốn tách thủ công và tạo điểm chuẩn

@SercanSametSavran Tôi muốn phân tách và đo điểm chuẩn theo cách thủ công

Cảm ơn bạn. Thật tuyệt vời. Mong chờ kết quả.

Cảm ơn. Điều đó thật tuyệt. Mong chờ kết quả.

@SercanSametSavran đã hoàn thành, xóa phiên bản regex vì nó chậm hơn gấp đôi

@SercanSametSavran Xong, xóa phiên bản biểu thức chính quy vì nó chậm gấp đôi

Xin lỗi vì phản hồi trễ. Đến giờ vẫn hoạt động bình thường mà không có vấn đề gì. Cảm ơn bạn.

Xin lỗi vì đã trả lời muộn. Cho đến nay tính năng này vẫn hoạt động tốt mà không gặp vấn đề gì. Cảm ơn.

25 4 0
trợ lý lỗi
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress