2010-02-12 34 views
57

Tôi muốn lưu trữ 3.50 vào bảng mysql. Tôi có một cái phao mà tôi cất giữ nó, nhưng nó lưu trữ là 3.5, không phải là 3.50. Làm thế nào tôi có thể làm cho nó có dấu 0?lưu trữ số tiền trong mysql

Trả lời

89

Không lưu trữ các giá trị tiền như phao, sử dụng thập phân hoặc kiểu NUMERIC:

Documentation for MySQL Numeric Types

EDIT & làm rõ:

giá trị Float là dễ bị tổn thương để làm tròn lỗi được họ đã chính xác giới hạn vì vậy trừ khi bạn không quan tâm rằng bạn chỉ nhận được 9,99 thay vì 10,00 bạn nên sử dụng DECIMAL/NUMERIC vì chúng là số điểm cố định không có vấn đề như vậy.

18

Có thực sự quan trọng nếu nó lưu trữ là 3.5, 3.50 hoặc thậm chí 3.500?

Điều gì thực sự quan trọng là cách nó được hiển thị sau khi nó được lấy từ db.

Hoặc tôi có thiếu gì đó ở đây không?

Cũng không sử dụng phao, sử dụng số thập phân. Float có tất cả các loại vấn đề làm tròn và không phải là rất lớn.

+1

tôi làm đề cập đến vấn đề làm tròn. Quan điểm của tôi là anh ta không nên lo lắng về việc nó được lưu trữ như thế nào nhưng nó được hiển thị như thế nào. Bạn sẽ không lưu trữ thông tin tài chính đến 2 chữ số thập phân - tỷ giá hối đoái là 5 và chúng tôi lưu trữ thành 6 nhưng chỉ hiển thị là 2. –

+1

(đã xóa nhận xét không liên quan trước đó). 1 cho điểm tốt về làm tròn. –

4

Tại sao bạn muốn lưu trữ "3.50" vào cơ sở dữ liệu của mình? 3.5 == 3.50 == 3.5000 cho đến khi cơ sở dữ liệu liên quan.

Trình bày và định dạng số liệu/ngày/v.v. của bạn nên được thực hiện trong ứng dụng, không phải trong cơ sở dữ liệu.

5

Nếu bạn sử dụng kiểu DECIMAL hoặc NUMERIC, bạn có thể khai báo chúng như ví dụ DECIMAL (18, 2) sẽ buộc 2 số thập phân ngay cả khi chúng bằng 0. Tùy thuộc vào giá trị lớn mà bạn mong đợi bạn có thể thay đổi giá trị của tham số đầu tiên.

16

Để giá trị cửa hàng bạn có thể sử dụng một DECIMAL (10,2) lĩnh vực, sau đó bạn có thể sử dụng chức năng FORMAT:

SELECT FORMAT(`price`, 2) FROM `table` WHERE 1 = 1 
35

Nó không phải nói chung là một ý tưởng tốt để lưu trữ tiền như một phao như làm tròn lỗi có thể xảy ra trong tính toán.

Cân nhắc sử dụng DECIMAL (10,2) thay thế.

+1

Ngay cả những con số như 0,1 và 0,2 là không thể đại diện trong điểm nổi nhị phân, không có vấn đề gì chính xác là. http: //en.wikipedia.org/wiki/Floating_point – Ray

0

Nhị phân không thể đại diện chính xác các điểm nổi chỉ với số bit giới hạn. Dữ liệu đó không bị mất nhiều dữ liệu nhưng thực sự là lỗi chuyển đổi .. Here's the manual giving examples

Bạn có thể thấy điều này trong hành động trong trình duyệt của mình, tự xem đoạn mã này.

<script> 
 

 
    var floatSum = 0; 
 

 
    // add 0.1 to floatSum 10 times 
 
    for (var i=0; i<10; i++) { 
 
     floatSum += 0.1; 
 
    } 
 

 
    // if the repetative adding was correct, the floatSum should be equal to 1 
 
    var expectedSum = 10*0.1; // 1 
 

 
    // you can see that floatSum does not equal 1 because of floating point error 
 
    document.write(expectedSum + " == " + floatSum + " = " + (expectedSum==floatSum) + "<br />"); 
 

 

 
    // --- using integers instead --- 
 
    // Assume the example above is adding £0.10 ten times to make £1.00 
 
    // With integers, we will use store money in pence (100 pence (also written 100p) in £1) 
 

 
    var intSum = 0; 
 

 
    // add 0.1 to floatSum 10 times 
 
    for (var i=0; i<10; i++) { 
 
     intSum += 10; 
 
    } 
 

 
    // if the repetative adding was correct, the floatSum should be equal to 1 
 
    var expectedSum = 10*10; // 100 
 

 
    // you can see that floatSum does not equal 1 because of floating point error 
 
    document.write(expectedSum + " == " + intSum + " = " + (expectedSum==intSum) + "<br />"); 
 
    document.write("To display as &pound; instead of pence, we can divide by 100 (presentation only) : &pound;" + intSum/100 + "<br />"); 
 
</script>

Các vấn đề liên quan