2013-02-12 37 views
8

Có thư viện BigDecimal với các phép toán cơ bản của BigDecimal cho phép giá trị null không?thư viện toán học java cho BigDecimal cho phép giá trị null

Null phải được coi là 0 cho mục đích toán học.

Tôi không muốn thực hiện tất cả các kiểm tra rỗng cho các giá trị null có thể có.

Bạn không bao giờ cho phép giá trị null trong cơ sở dữ liệu, ứng dụng hoặc chế độ xem và khởi tạo mọi thứ với new BigDecimal(0) hoặc thực hiện kiểm tra null trên mọi mức sử dụng cho giá trị nullable.

Cái gì như:

public static BigDecimal add(final BigDecimal value, final BigDecimal augend) 
{ 
    if (value == null) 
     return augend; 
    else if (augend == null) 
     return value; 
    else 
     return value.add(augend); 
} 

public static BigDecimal multiply(final BigDecimal value, final BigDecimal multiplicand) 
{ 
    if (value == null || multiplicand == null) 
     return null; 

    return value.multiply(multiplicand); 
} 

Trả lời

13

Lưu mã hóa, chỉ không cho phép giá trị null trong cơ sở dữ liệu. Đặt giá trị mặc định bằng 0.

Đối với new BigDecimal(0): không, sử dụng BigDecimal.ZERO.

+1

+1 cho 'BigDecimal.Zero'. Chưa bao giờ kiểm tra điều đó. – djmj

+0

Với câu trả lời cho trước, tôi quyết định không cho phép giá trị null cho số thập phân của tôi trong cơ sở dữ liệu. Tôi đã suy nghĩ cách lâu dài để cho phép hay không, và theo dõi trạng thái vô giá trị chỉ là lãng phí thời gian mã hóa. – djmj

+0

Chi phí nhỏ để tạo ra một hàm so sánh dấu phẩy động cho các mục đích gui là một giao dịch công bằng. – djmj

5

Tôi đoán tôi không nhìn thấy điểm của thư viện kiểm tra cho null. Chắc chắn, thư viện sẽ không ném một NPE, nhưng người gọi cuối cùng sẽ phải kiểm tra nó. Người gọi của bạn ở trên nhân sẽ làm gì? Nó không thể chỉ sử dụng đầu ra. Nó sẽ phải kiểm tra xem nếu giá trị trả về là null tại một số điểm trước khi nó có thể làm bất cứ điều gì với giá trị.

Ngoài ra, đối với bất kỳ ứng dụng nào tôi từng viết, một giá trị null khác nhiều so với 0. Tôi sẽ không muốn sử dụng một trong đó xử lý một null là số không.

Nếu yêu cầu của bạn là null không được phép trong DB của bạn, tôi sẽ kiểm tra các giá trị rỗng trong lớp DAO của bạn trước khi ghi vào DB.

+0

Trong một JSF xem nó rất hữu ích nếu dữ liệu có thể được kiểm tra null, để hiển thị thông tin khác cho người dùng. Tôi hiện không sử dụng điều này ở lớp DAO nơi mọi thứ được kiểm tra cho các giá trị null. Hiện tại chỉ là một số thử nghiệm cho chỉ xem dữ liệu có liên quan. – djmj

+0

Ah ok. Sau đó, có thể một số phương pháp tĩnh như bạn có ở trên có thể giúp bạn tiết kiệm một số rắc rối. Chỉ cần nghi ngờ bạn sẽ có nhiều may mắn tìm kiếm một thư viện BigDecimal xử lý null là số không hoặc sẽ không ném NPE khi một trong các đối số vào nó là null. – Kyle

+1

Chuyển đổi số không thành 0 ở mọi nơi bạn nhận được; không chỉ để lại null nằm ở đó. –

6

Tôi đã có một vấn đề tương tự (không liên quan đến cơ sở dữ liệu, chỉ cần tổng hợp một vài có thể là BigDecimals không). Không tìm thấy bất kỳ thư viện, vì vậy phải viết hàm sau bản thân mình:

public static BigDecimal add(BigDecimal... addends) { 
    BigDecimal sum = BigDecimal.ZERO; 
    if (addends != null) { 
     for (BigDecimal addend : addends) { 
      if (addend == null) { 
       addend = BigDecimal.ZERO; 
      } 
      sum = sum.add(addend); 
     } 
    } 
    return sum; 
} 

Cùng trong Java 8:

public static BigDecimal add(BigDecimal... addends) { 
    if (addends == null) { 
     return BigDecimal.ZERO; 
    } 
    return Arrays.stream(addends) 
      .filter(Objects::nonNull) 
      .reduce(BigDecimal.ZERO, BigDecimal::add); 
} 
Các vấn đề liên quan