2010-09-06 8 views
11

Nếu tôi có chức năng này chút:Tại sao tổng của 2 biến parseFloat cung cấp cho tôi một số thập phân sai

<script type="text/javascript"> 

function printFloat(){ 
     var myFloatNumber1 = document.getElementById('floatNumber1'); 
     var myFloatNumber2 = document.getElementById('floatNumber2'); 
     alert(parseFloat(myFloatNumber1.value) + parseFloat(myFloatNumber2.value)) 
} 

</script> 

<input type="text" id="floatNumber1"></input> 
<input type="text" id="floatNumber2"></input> 

<input type="button" onclick="printFloat()"/> 

trong lĩnh vực 1 Tôi nhập: 221,58 trong lĩnh vực 2 Tôi nhập: 2497,74

Tôi hy vọng tổng của 2 số trong các trường nhập là số gồm 2 chữ số: 2719.32 Nhưng kết quả là số không chính xác ...: 2719.3199999999997

một vòng sẽ thực hiện công việc, nhưng tôi không nhận được tại sao mã thực hiện điều này trên numbe này r ... Mở kết hợp số khác, số tiền là đúng ...

Trả lời

17

Từ The Floating-Point-Guide:

Tại sao các con số của tôi, chẳng hạn như 0,1 + 0,2 cộng thêm vào vòng 0,3 và thay vào đó tôi nhận được kết quả lạ như 0.30000000000000004?

Bởi vì trong nội bộ, máy tính sử dụng một định dạng (nhị phân dấu chấm động) mà không thể đại diện một cách chính xác một số như 0.1, 0.2 hay 0.3 gì cả.

Khi mã được biên dịch hoặc giải thích, bạn “0.1” đã là tròn đến số gần nhất trong đó định dạng , mà kết quả trong một nhỏ làm tròn lỗi ngay cả trước khi tính xảy ra.

Trong trường hợp của bạn, lỗi làm tròn xảy ra khi giá trị bạn nhập được chuyển đổi parseFloat().

Tại sao các phép tính khác như 0,1 + 0,4 hoạt động chính xác?

Trong trường hợp đó, kết quả (0.5) có thể đại diện chính xác như một số dấu chấm động, và nó có thể cho làm tròn sai sót trong các con số đầu vào để triệt tiêu lẫn nhau - Nhưng điều đó có thể' nhất thiết phải dựa vào (ví dụ khi hai số đó là được lưu trữ ở các đại diện nổi có kích thước khác nhau trước tiên, các lỗi làm tròn có thể không bù trừ từng số khác).

Trong những trường hợp khác như 0.1 + 0.3, các kết quả thực sự là không thực sự 0,4, nhưng đủ gần mà 0.4 là số ngắn nhất đó là gần gũi hơn với kết quả hơn bất kỳ số dấu chấm động khác.Nhiều ngôn ngữ sau đó hiển thị số đó thay vì chuyển đổi kết quả thực tế trở lại thành phần thập phân gần nhất.

4

chỉ cần làm theo.

function printFloat(){ 
     var myFloatNumber1 = document.getElementById('floatNumber1'); 
     var myFloatNumber2 = document.getElementById('floatNumber2'); 
     var total=parseFloat(myFloatNumber1.value) + parseFloat(myFloatNumber2.value); 
     alert(total.toFixed(2)); 
}